为什么此函数运行而不使用返回值初始化全局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发布于 2015-10-05 04:43:28
如果"use strict;"被移除,这两种方法都可以工作。但别那么做--继续读下去。
严格模式防止XYZ = ...成为新的全局变量。
John在他对严格模式的概述中解释了
在未定义
foo = "bar";的情况下分配foo的尝试将失败。以前,它会将值赋值给全局对象的foo属性(例如window.foo),现在它只是抛出一个异常。这肯定会捕捉到一些恼人的bug。
使用window.XYZ = IIFE()的代码在严格模式下工作,因为在这里分配给一个现有对象window的属性。
对许多应用程序来说,使用window.XYZ可能“足够好”,但您可能会遇到一个平台(如Meteor),在包管理器中使用window.XYZ“短路”依赖管理。在这种情况下,严格模式可以在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);
警告:“使用严格;”作为第2行不启用严格模式:
别这么做:
XYZ = 0;
"use strict";
XYZ = ...您可以通过查看未显式设置this的函数中的this来测试是否启用了严格模式。当严格模式为真时,this在未设置时为null,而当严格模式为false时,this将为window。
https://stackoverflow.com/questions/32941401
复制相似问题