这里已经是晚上很晚了,所以我可能功能不太好,但我发现了这段代码,我似乎无法弄清楚为什么它是这样使用的(注意:我理解它的作用,我不明白的是它背后的含义)。
(function() {
var narcissus = {
options: {
version: 185,
},
hostGlobal: this
};
Narcissus = narcissus;
})();
自执行的匿名函数用于避免全局命名空间的污染,但是这段代码不需要引入除
Narcissus
之外的其他变量,因此它可以很容易地重写为Narcissus = {...};
。我能想到的一些可能的原因是代码的面向未来或实现缺陷。有什么我看不到的吗?
从可维护性的角度来看,它允许作者稍后在闭包范围中添加代码,这些代码在创建
narcissus
和分配 Narcissus
之间不会泄漏。 尽管在这种情况下没有任何代码,所以除了上面提到的this
内容之外,我没有看到任何收益。
您缺少的部分是 javascript 是一种区分大小写的语言,所以
Narcissus != narcissus;
他通过省略
Narcissus
关键字将 var
添加到全局作用域,或者 Narcissus 已经在全局作用域中可用,或者 Narcissus
已经在调用此函数的作用域中定义。
然后将其定义为匿名函数内的对象
narcissus
。
我无法告诉你他为什么这样做,但看起来他可能已经在一个范围内,其中
this
指的是一个对象,并且他想将键 hostGlobal
设置为全局对象而不是当前范围的对象对象。
这就是为什么他将其作为匿名函数运行,因为它们是在全局范围而不是函数范围中执行的。所以在他的代码中
hostGlobal: this
指的是全局对象。
当然他可以只使用
hostGlobal: window
,除非此代码也在非浏览器环境中运行,例如node.js,其中全局对象是global
而不是window
。所以他这样做可能是一种非常不直观的实现方法。
hostGlobal: ( global === undefined )? window : global
希望这有帮助