首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除非调用为window.XYZ = IIFE(),否则无法定义IIFE单个全局

除非调用为window.XYZ = IIFE(),否则无法定义IIFE单个全局
EN

Stack Overflow用户
提问于 2015-10-05 04:43:28
回答 1查看 176关注 0票数 1

为什么此函数运行而不使用返回值初始化全局XYZ

代码语言:javascript
复制
"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时,它工作得很好:

代码语言:javascript
复制
"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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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内部实现,但不能在页面级别实现。

若要在分配给新全局对象的单例生命周期中使用严格模式,只需在第一行内打开严格模式。

代码语言:javascript
复制
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行不启用严格模式:

别这么做:

代码语言:javascript
复制
XYZ = 0;
"use strict";
XYZ = ...

您可以通过查看未显式设置this的函数中的this来测试是否启用了严格模式。当严格模式为真时,this在未设置时为null,而当严格模式为false时,this将为window

另见:在JavaScript中“使用严格”是做什么的,它背后的理由是什么?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32941401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档