遇到一些在表达式中使用IIFE而不仅仅是正常函数的代码。
var custom_type = (function() {
return $('#myDiv').attr('custom_type');
})();
通常我会把它写成:
var custom_type = function() {
return $('#myDiv').attr('custom_type');
};
IIFE的原因是什么?我唯一能想到的是,IIFE可能只在开头分配custom_type
变量一次,而第二个可能会在每次引用变量时继续检查更新的类型。
答案 0 :(得分:6)
在这个例子中,您可以完全省略该功能,只需执行以下操作:
var custom_type = $('#myDiv').attr('custom_type');
然而,一般情况下,您可以使用IIFE进行更复杂的“即时”变量赋值计算 - 如果我需要迭代某些东西,我喜欢使用它们,所以我可以i
没有污染目前的范围。
在第二个示例中,结果完全不同 - 您需要调用函数custom_type()
以获取当前值,而第一段代码将获得其值一次,变量将保持该值。
答案 1 :(得分:2)
IIFE实际上会运行(立即调用函数表达式),因此变量将被设置为其响应。
这是一个JSFiddle来演示这个,看看你的JS控制台输出:http://jsfiddle.net/Y4JmT/1/
代码在这里:
var custom_type = (function() {
return 'foo';
})();
var custom_type2 = function() {
return 'bar';
};
console.log('iife = ' + custom_type);
console.log('non-iife = ' + custom_type2);
在JS控制台中,您会看到类似于:
的内容iife = foo
和
non-iife = function () {
return 'bar';
}
答案 2 :(得分:2)
你的第一个(IIFE)执行函数并存储其结果,秒存储函数作为定义。
(function(x) {
return x * 2;
})(5);
你正在调用普通的函数funciton:func(arg1,arg2),但是你传递整个函数定义而不是函数名,所以上面会返回 10 ,如:
function multiply(x) {
return x * 2;
}
multiply(5);
他们的意思相同,你正在打电话。不太可能是第一个,第二个是定义加一个电话。
答案 3 :(得分:1)
IIFE允许您在创建时调用函数(匿名或其他)。 你看过这个吗? http://benalman.com/news/2010/11/immediately-invoked-function-expression/