不,您不能禁用每个功能的严格模式。
理解严格模式在词法上工作很重要;意义——它影响函数声明,而不是执行。在严格代码中声明的任何函数本身都会成为严格函数。但并非任何从严格代码中调用的函数都必须是严格的:
(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')();
})();
关于全局评估的这种混淆可能来自于全局评估可用于从严格模式(不再简单地通过)访问全局对象的事实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)。