【问题标题】:key word THIS in javascript as global namespacejavascript中的关键字THIS作为全局命名空间
【发布时间】:2016-07-11 04:43:42
【问题描述】:

我正在阅读来自here的代码示例

你会发现它是 javascript 中的 IIFE。在阅读了一些文档后,我现在很清楚它是什么以及它是如何以简单的方式工作的。

但是在这个脚本的最后,它通过了“this['routingConfig']”

(function(exports){

    // Other codes
    exports.userRoles = buildRoles(config.roles);
    // Other codes and definition of buildRoles

})(typeof exports === 'undefined' ? this['routingConfig'] = {} : exports);

那么似乎我们可以在其他脚本文件中直接调用它:

var access = routingConfig.userRoles;

那么具体的用法是什么

(typeof exports === 'undefined' ? this['routingConfig'] = {} : exports);

似乎'this'关键字作为全局命名空间,添加'routingConfig'作为键值对。

【问题讨论】:

  • 如果您打开控制台并输入this,您将看到全局窗口。

标签: javascript angularjs iife


【解决方案1】:

这行代码:

(typeof exports === 'undefined' ? this['routingConfig'] = {} : exports);

最终将决定将什么作为第一个参数传递给 IIFE。

  1. 如果exports定义在当前范围内,那么它将通过exports
  2. 如果未定义exports,则它将this['routingConfig'] 初始化为一个空对象并将该空对象作为第一个参数传递。

如果routingConfig.userRoles 可以在代码的其他地方访问,那是因为this['routingConfig'] 在某个对象上设置了一个属性(无论this 在这段代码中指向什么),并且该对象显然可以在代码的其他地方访问。

this 可能指向global 对象,但我们必须查看代码的整个上下文才能确定。如果它确实指向全局对象,那可以解释为什么它可以从代码中的其他位置访问。


就我个人而言,我从不编写假定this 是全局对象的代码。如果我想引用全局对象,我直接引用它。然后任何人只要看一眼你的代码就会知道代码的确切用途,而不会想知道this 的设置是什么。

我对@9​​87654333@ 的使用几乎完全是方法调用中的宿主对象,或者是在调用回调函数时通过文档专门设置的东西,例如用于DOM 事件的.addEventListener()。这使得从本地代码上下文中可以更清楚地看到 this 的设置。

【讨论】:

    猜你喜欢
    • 2012-11-08
    • 1970-01-01
    • 2013-11-19
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2015-04-22
    相关资源
    最近更新 更多