所以我看到一个函数,它的简单性非常漂亮,因为它允许你在匿名函数中找到全局对象(当时依赖于环境可能不是窗口);但是当你抛出javascripts的“use strict”时;由于关键字'this'的变化评估,它会崩溃。有几种方法可以实现这一目标?
(function () {
var win = function () {
return (function () {
return this;
}());
};
//win now points to the global object no matter where it is called.
}());
现在,如果在“use strict”的上下文中调用它们,我们将失去所描述的功能,是否有任何可以在ES5严格模式下完成的等效项?
供参考
(function () {
"use strict"
//code here is in strict mode
}())
答案 0 :(得分:8)
如果您需要访问全局对象而不对标识符窗口进行硬编码,则可以从任何级别的嵌套函数范围执行以下操作:
var global = (function () {
return this;
}());
这样,您始终可以获取全局对象,因为在调用的内部函数中 作为函数(也就是说,不是新的限制器),这应该始终指向 全球对象。
在严格模式下,ECMAScript 5实际上不再是这种情况, 因此,当您的代码处于严格模式时,您必须采用不同的模式。
例如, 如果您正在开发库,则可以将库代码包装在一个立即函数中 (在第4章中讨论)然后从全局范围,将此引用作为一个 你的直接功能的参数。
通常,全局对象作为参数传递给immediate函数 它可以在函数内部访问,而不必使用窗口:这种方式使 代码在浏览器之外的环境中更具互操作性:
(function (global) {
// access the global object via `global`
}(this));
“JavaScript模式,由Stoyan Stefanov撰写 (O'Reilly出版)。版权所有2010 Yahoo!,Inc.,9780596806750。“
答案 1 :(得分:8)
var global = Function('return this')();
适用于所有浏览器,引擎,ES3,ES5,严格,嵌套范围等。
略有变化将通过JSLINT:
var FN = Function, global = FN('return this')();
答案 2 :(得分:1)
以下是来自Perfection Kills的片段,使用全局评估。
var root = (function () {
return this || (0 || eval)('this');
}());
ECMA3,ECMA5,Strict模式等兼容,通过JSLint。