特定の機能にはECMAScript厳密モードを無効にできますか?
-
14-11-2019 - |
質問
ここでの私の質問については、MDCまたはECMAScriptの仕様については見つかりません。おそらくこれを解決するためのより多くの「ハッキー」な方法を知っているでしょう。
私は私の環境ですべてのJavaScriptファイルに"use strict"
を呼び出しています。私のファイルはすべてこののように始まります
(function(win, doc, undef) {
"use strict";
// code & functions
}(window, window.document));
.
今、私はエラーを処理するカスタム機能を持っています。その関数は.caller
プロパティを使用してコンテキストスタックトレースを提供します。このように見えます:
.
var chain = (function() {
var _parent = _error,
_ret = '';
while( _parent.caller ) {
_ret += ' -> ' + _parent.caller.name;
_parent = _parent.caller;
}
return _ret;
}());
もちろん、厳密モードでは、.caller
は検索時にスローする非削除可能な小道具です。だから私の質問は、 disable 厳密な "機能的な"?を厳守する方法を知っています。
"use strict";
は、呼び出された後にすべての関数によって継承されます。今度は、それらの上部に"use strict";
を呼び出すだけで、特定の機能で厳密なモードを使用することを可能にしますが、反対の?を達成する方法はありますか?
解決
いいえ、関数ごとに厳密モードを無効にすることはできません。
厳密なモードがうまくいくことを理解することは重要です lex strong>。意味 - 実行されていない関数宣言に影響します。厳密なコード内で宣言された関数は厳密な関数自体になります。しかし、厳密なコード内からという関数は必ず厳密です。
.
(function(sloppy) {
"use strict";
function strict() {
// this function is strict, as it is _declared_ within strict code
}
strict();
sloppy();
})(sloppy);
function sloppy(){
// this function is not strict as it is _declared outside_ of strict code
}
厳密なコードの外側の関数を定義することができる方法の外部で、それを厳密な関数に渡します。
あなたの例で似たことができる - "sloppy"関数を持つオブジェクトを持っているので、そのオブジェクトをその厳密にすぐに呼び出された関数に渡します。もちろん、「sloppy」機能がメインラッパー関数内からの変数を参照する必要がある場合は機能しません。
間接eval - 誰かによって提案されているそれ以外の場合 - 本当にここに助けないでしょう。すべてのことは、グローバルコンテキストの実行コードです。ローカルで定義されている関数を呼び出しようとすると、間接的なevalさえ見つけません。
.
(function(){
"use strict";
function whichDoesSomethingNaughty(){ /* ... */ }
// ReferenceError as function is not globally accessible
// and indirect eval obviously tries to "find" it in global scope
(1,eval)('whichDoesSomethingNaughty')();
})();
グローバルエバリティについてのこの混乱はおそらく、グローバルevalが厳密モード内からグローバルオブジェクトへのアクセスを取得するために使用できること(これは、this
を介して単にアクセス可能ではない):
.
(function(){
"use strict";
this; // undefined
(1,eval)('this'); // global object
})();
質問に戻る...
に継承されない厳密さを介して起こるが、それは(非標準)関数の偏光に頼っていて、
.
(function(){
"use strict";
function strict(){ /* ... */ }
// compile new function from the string representation of another one
var sneaky = Function('return (' + strict + ')()');
sneaky();
})();
FF4 +は(私が知ることができるものから)SPECに反対し、厳密にFunction
を介して作成された関数を厳密にマークしているように見えます。これは他の厳密モードサポート実装(Chrome 12+のように) 、IE10、ウェブキット)。
他のヒント
( http://javascriptweblog.wordpress.com/2011/2011)/ 05/03 / JavaScript-Strict-Mode / )
(...)厳密モードは施されていない 呼び出された非厳密な関数 厳格な機能の体内の内側に (それらが渡されたから)
call
を使用して引数または呼び出されたapply
)。SO厳密なモードなしでエラーメソッドを設定してから、次のようにパラメータとしてそれらを渡す場合は、次のようになります。
.var test = function(fn) { 'use strict'; fn(); } var deleteNonConfigurable = function () { var obj = {}; Object.defineProperty(obj, "name", { configurable: false }); delete obj.name; //will throw TypeError in Strict Mode } test(deleteNonConfigurable); //no error (Strict Mode not enforced)
...それは働くべきです。
代替案は単にこのをすることです
var stack;
if (console && console.trace) {
stack = console.trace();
} else {
try {
var fail = 1 / 0;
} catch (e) {
if (e.stack) {
stack = e.stack;
} else if (e.stacktrace) {
stack = e.stacktrace;
}
}
}
// have fun implementing normalize.
return normalize(stack);
.