我正在阅读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'作为键值对。
答案 0 :(得分:4)
这行代码:
(typeof exports === 'undefined' ? this['routingConfig'] = {} : exports);
最终将决定通过什么作为IIFE的第一个参数。
exports
,则会传递exports
。exports
,则会将this['routingConfig']
初始化为空对象,并将该空对象作为第一个参数传递。如果代码中的其他位置可以访问routingConfig.userRoles
,那就是因为this['routingConfig']
在某个对象上设置了一个属性(此代码中的this
点)并且该对象显然是可访问的代码中的其他地方。
this
可能指向global
对象,但我们必须确保知道代码的整个上下文。如果它确实指向全局对象,那么这可以解释为什么可以从代码中的其他位置访问它。
就个人而言,我从不编写假设this
是全局对象的代码。如果我想引用全局对象,我直接引用它。然后,任何看过代码的人都会确切地知道代码的意图,而不会想知道this
的设置是什么。
我对this
的使用几乎完全是方法调用中的宿主对象,或者在调用回调函数时通过文档专门设置的东西,例如DOM事件的.addEventListener()
。这使得this
设置为的本地代码上下文更加清晰。