JavaScript匿名函数表达式与IIFE

时间:2014-04-09 22:49:17

标签: javascript anonymous-function iife function-expression

遇到一些在表达式中使用IIFE而不仅仅是正常函数的代码。

var custom_type = (function() {
    return $('#myDiv').attr('custom_type');
})();

通常我会把它写成:

var custom_type = function() {
    return $('#myDiv').attr('custom_type');
};

IIFE的原因是什么?我唯一能想到的是,IIFE可能只在开头分配custom_type变量一次,而第二个可能会在每次引用变量时继续检查更新的类型。

4 个答案:

答案 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/