关键词这在javascript中作为全局命名空间

时间:2016-03-23 18:20:18

标签: javascript angularjs iife

我正在阅读here

中的代码示例

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

但是在这个剧本的最后,它通过了#"这[' 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);

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

1 个答案:

答案 0 :(得分:4)

这行代码:

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

最终将决定通过什么作为IIFE的第一个参数。

  1. 如果在当前范围内定义exports,则会传递exports
  2. 如果未定义exports,则会将this['routingConfig']初始化为空对象,并将该空对象作为第一个参数传递。
  3. 如果代码中的其他位置可以访问routingConfig.userRoles,那就是因为this['routingConfig']在某个对象上设置了一个属性(此代码中的this点)并且该对象显然是可访问的代码中的其他地方。

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

    就个人而言,我从不编写假设this是全局对象的代码。如果我想引用全局对象,我直接引用它。然后,任何看过代码的人都会确切地知道代码的意图,而不会想知道this的设置是什么。

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