Нет, вы не можете отключить строгий режим для каждой функции.
Важно понимать, что строгий режим работает лексически; смысл - это влияет на объявление функции, а не на выполнение. Любая функция, объявленная в строгом коде, сама становится строгой функцией. Но не любая функция, вызываемая из строгого кода, обязательно является строгой:
(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
}
Обратите внимание, как мы можем определить функцию вне строгого кода, а затем передать ее строгой функции.
Вы можете сделать что-то подобное в своем примере - создать объект с «неаккуратными» функциями, а затем передать этот объект этой строгой, немедленно вызываемой функции. Конечно, это не сработает, если «небрежным» функциям нужно ссылаться на переменные из основной функции-оболочки.
Также обратите внимание, что косвенная оценка, предложенная кем-то другим, выиграла здесь действительно не поможет. Все, что он делает, это выполняет код в глобальном контексте. Если вы попытаетесь вызвать функцию, которая определена локально, косвенный 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, вероятно, происходит из-за того, что глобальный eval может использоваться для получения доступа к глобальному объекту из строгого режима (который больше не доступен просто через this
):
(function(){
"use strict";
this; // undefined
(1,eval)('this'); // global object
})();
Но вернемся к вопросу ...
Вы можете обмануть и объявить новую функцию с помощью конструктора Function
- что случается с не наследованием строгости, но это будет зависеть от (нестандартной) декомпиляции функции, и вы потеряете возможность ссылаться внешние переменные.
(function(){
"use strict";
function strict(){ /* ... */ }
// compile new function from the string representation of another one
var sneaky = Function('return (' + strict + ')()');
sneaky();
})();
Обратите внимание, что FF4 +, похоже, не соответствует спецификации (насколько я могу судить) и неправильно отмечает функцию, созданную с помощью Function
, как строгую. Этого не происходит в других реализациях с поддержкой строгого режима (например, Chrome 12+ , IE10, WebKit).
person
kangax
schedule
18.05.2011