除非被称为window.XYZ = IIFE()

时间:2015-10-05 04:43:29

标签: javascript

为什么此函数运行而不是使用返回值初始化全局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

jsfiddle

奇怪的是,前两个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

1 个答案:

答案 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?