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

key word THIS in javascript as global namespace

本文关键字:全局 命名空间 THIS 关键字 javascript      更新时间:2023-09-26

我正在从这里读取代码样本

您会发现它是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的使用几乎完全是方法调用中的主机对象,或者是在为DOM事件调用回调函数(如.addEventListener())时通过文档专门设置的对象。这使得从本地代码上下文中可以更清楚地了解this的设置。