如果 IIFE 仅包含一个立即导出到全局范围的变量声明,为什么还要费心呢?

问题描述 投票:0回答:2

这里已经是晚上很晚了,所以我可能功能不太好,但我发现了这段代码,我似乎无法弄清楚为什么它是这样使用的(注意:我理解它的作用,我不明白的是它背后的含义)。

(function() {

    var narcissus = {
        options: {
            version: 185,
        },
        hostGlobal: this
    };
    Narcissus = narcissus;
})();

自执行的匿名函数用于避免全局命名空间的污染,但是这段代码不需要引入除

Narcissus
之外的其他变量,因此它可以很容易地重写为
Narcissus = {...};
。我能想到的一些可能的原因是代码的面向未来或实现缺陷。有什么我看不到的吗?

javascript iife
2个回答
1
投票

从可维护性的角度来看,它允许作者稍后在闭包范围中添加代码,这些代码在创建

narcissus
和分配
Narcissus
之间不会泄漏。 尽管在这种情况下没有任何代码,所以除了上面提到的
this
内容之外,我没有看到任何收益。


0
投票

您缺少的部分是 javascript 是一种区分大小写的语言,所以

Narcissus != narcissus; 

他通过省略

Narcissus
关键字将
var
添加到全局作用域,或者 Narcissus 已经在全局作用域中可用,或者
Narcissus
已经在调用此函数的作用域中定义。

然后将其定义为匿名函数内的对象

narcissus

我无法告诉你他为什么这样做,但看起来他可能已经在一个范围内,其中

this
指的是一个对象,并且他想将键
hostGlobal
设置为全局对象而不是当前范围的对象对象。

这就是为什么他将其作为匿名函数运行,因为它们是在全局范围而不是函数范围中执行的。所以在他的代码中

hostGlobal: this
指的是全局对象。

当然他可以只使用

hostGlobal: window
,除非此代码也在非浏览器环境中运行,例如node.js,其中全局对象是
global
而不是
window
。所以他这样做可能是一种非常不直观的实现方法。

hostGlobal: ( global === undefined )? window : global  

希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.