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