为什么此函数运行而不是使用返回值初始化全局XYZ
?
"use strict";
XYZ = (function(){
var obj = {'a':1,'b':2,'c':3};
console.log("about to return:");
console.log(obj);
return obj;
})();
console.log(XYZ); // shows undefined
奇怪的是,前两个console.log返回合理输出,然后Chrome抛出Uncaught ReferenceError: XYZ is not defined
明确使用window.XYZ
时,这样可以正常工作:
"use strict";
window.XYZ = (function(){
var obj = {'a':1,'b':2,'c':3};
console.log("about to return:");
console.log(obj);
return obj;
})();
console.log(XYZ); // shows a:1, b:2, c:3
答案 0 :(得分:1)
如果移除"use strict;"
,则可以使用。但不要这样做 - 继续阅读。
严格模式可防止XYZ = ...
成为新的全局变量。
John Resig explains in his overview of strict mode:
尝试分配
foo = "bar";
尚未定义foo
的地方 失败。以前它会将值赋给foo属性 全局对象(例如window.foo
),现在它只抛出一个异常。这个 肯定会抓住一些恼人的错误。
window.XYZ = IIFE()
的代码在严格模式下工作,因为此处的赋值是现有对象window
的属性。
使用window.XYZ
可能足够好"对于许多应用程序,但您可能会遇到使用window.XYZ
"短路和#34;的平台(如Meteor)。包管理器中的依赖关系管理。在这种情况下,严格模式可以在IIFE内部启用,但不能在页面级别启用。
要使用严格模式并将单个IIFE分配给新的全局,只需在第一行的IIFE内打开严格模式。
XYZ = (function() {
"use strict";
var obj = {
'a': 1,
'b': 2,
'c': 3
};
console.log("about to return:");
console.log(obj);
return obj;
})();
console.log(XYZ);

警告:"使用严格;"因为第二行没有启用严格模式:
不要这样做:
XYZ = 0;
"use strict";
XYZ = ...
您可以通过查看未明确设置this
的函数内的this
来测试是否启用了严格模式。当严格模式为真时,this
在取消设置时为null
,但当严格模式为假时,this
将为window
。
另请参阅:What does "use strict" do in JavaScript, and what is the reasoning behind it?