如何立即调用IIFE,以防止其污染全球范围?

时间:2018-06-20 05:21:59

标签: javascript scope iife revealing-module-pattern

在关于立即调用的函数表达式的Udacity课程中(关于提供的代码段),它说:

  

正在返回的函数关闭(即捕获)   您好变量。这允许myFunction维护私有的,可变的   状态无法在函数外部访问!更重要的是:   由于所表达的函数被立即调用,因此IIFE包装   很好地修改代码,以免污染全局范围

我正在努力了解立即调用匿名函数与防止变量hi“污染全局范围”有关,并且由于hi已经在函数中定义了,它已经不在本地/私有范围内了吗?

const myFunction = (
  function () {
    const hi = 'Hi!';
    return function () {
      console.log(hi);
    }
  }
)();

2 个答案:

答案 0 :(得分:1)

在现代JavaScript中,您具有let和块作用域(而且我很确定const也具有块作用域),因此您可以这样做:

let myFunction;
{
    let hi = 'Hi!';
    myFunction = function () {
        console.log(hi);
    };
}

这将创建myFunction,而不会将hi泄漏到周围的示波器中。

在传统的JavaScript中,您只有var和函数作用域,您可以这样做:

var myFunction;
function a_private_scope() {
    var hi = 'Hi!';
    myFunction = function () {
        console.log(hi);
    };
}
a_private_scope();

a_private_scope限制了hi的范围,但是(它是一个函数声明)它需要显式调用,并且我们仍然将名称泄漏给周围的范围(这次是{{1 }},即“服务范围”的名称。

通过使用函数 expression 并立即调用它,我们避免了这种二次污染:

a_private_scope

现在,在外部范围中定义的唯一内容是var myFunction; (function () { var hi = 'Hi!'; myFunction = function () { console.log(hi); }; })(); 。充当myFunction范围的匿名函数没有名称,它可以污染周围的范围。

最后,我们可以使用返回值对其进行清理,因此我们不必重复提及hi

myFunction

(这也为我们节省了一对var myFunction = function () { var hi = 'Hi!'; return function () { console.log(hi); }; }(); (,因为)关键字不再出现在语句的开头。)

答案 1 :(得分:0)

  

如何立即调用IIFE防止其污染全球范围?

不是。

成为函数可以阻止它污染全局范围。

在函数内声明的变量仅存在于该函数内