在javaScript中使用立即调用的函数表达式(IIFE)有什么用处

时间:2014-06-07 07:25:23

标签: javascript

据我所知,LIFE是一个匿名函数,可以自行调用,但我很想知道它在哪里使用。任何人都可以解释一个快速用例吗?

(function() {
  console.log('IIFE!');
})();

1 个答案:

答案 0 :(得分:1)

这是为事物创建容器的好方法;一个新的,包含的范围。我在页面中的所有JavaScript中使用它们,例如:

(function() {
    var x;

    function foo() {
    }
})();

如果没有IIFE,如果我只是在普通脚本的最顶端:

var x;

function foo() {
}

...然后xfoo将是全局变量,全局命名空间已经 方式 过度拥挤。通过将它们放在函数中,我将它们包含在内。它们可以互相引用,它们在IIFE中的我的代码中很常见,但它们不是全局的。

它不仅必须适用于页面上的所有代码;我在多个级别使用它来保护隐私。例如,如果我想创建一个带有一个外部符号但有许多内部部分的东西:

var externalFoo = (function() {
    var someVariable;

    function foo() {
    }

    function bar() {
    }

    return foo;
})();

在外部上下文中创建一个符号(可能是全局的,也可能不是全局的,取决于上面的代码块的位置),externalFoo。在IIFE内部,我有许多私人事物,可能有助于externalFoo完成其工作,但它们是“管道”,不应该从外部访问。

对我来说,这是他们的主要用途,为他们的内容创造隐私。

有些人使用IIFE为循环中的闭包创建新的作用域,如下所示:

var i;
for (i = 0; i < 10; ++i) {
    (function(index) {
        setTimeout(function() {
            doSomthingWith(index);
        }, index * 100);
    })(i);
}

这样doSomethingWith看到每个值(0,1,2,...)。但是对于那个用例,我不想在每个循环迭代中创建和销毁外部匿名函数(IIFE)(而是使用单个构建器函数),我更喜欢更清楚我正在做什么:

var i;
for (i = 0; i < 10; ++i) {
    setTimeout(buildHandler(i), i * 100);
}

function buildHandler(index) {
    return function() {
        doSomthingWith(index);
    };
}