javascript 中的关键字 THIS 作为全局命名空间

key word THIS in javascript as global namespace

我正在阅读来自 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'作为键值对。

这行代码:

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

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

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

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

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


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

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