Нет, вы не можете отключить строгий режим для каждой функции.
Важно понимать, что строгий режим работает лексически ;смысл - это влияет на объявление функции, а не на выполнение.Любая функция , объявленная в строгом коде, становится самой строгой функцией.Но не любая функция , называемая в строгом коде, обязательно является строгой:
(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 - предложенный кем-то другим - на самом деле не будетпомогите здесь.Все, что он делает, это выполняет код в глобальном контексте.Если вы попытаетесь вызвать функцию, которая определена локально, косвенный 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).