据我所知,LIFE是一个匿名函数,可以自行调用,但我很想知道它在哪里使用。任何人都可以解释一个快速用例吗?
(function() {
console.log('IIFE!');
})();
答案 0 :(得分:1)
这是为事物创建容器的好方法;一个新的,包含的范围。我在页面中的所有JavaScript中使用它们,例如:
(function() {
var x;
function foo() {
}
})();
如果没有IIFE,如果我只是在普通脚本的最顶端:
var x;
function foo() {
}
...然后x
和foo
将是全局变量,全局命名空间已经 方式 过度拥挤。通过将它们放在函数中,我将它们包含在内。它们可以互相引用,它们在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);
};
}