不,你不能禁用每个函数的严格模式。
理解严格模式在词法上起作用很重要;意思 - 它影响函数声明,而不是执行。在严格代码中声明的任何函数本身都成为严格函数。但并不是从严格代码中调用的任何函数都一定是严格的:
(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
as strict创建的函数。这不会发生在其他支持严格模式的实现中(如 Chrome 12+、IE10、WebKit)。