7

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

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

通常我会这样写:

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

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

4

4 回答 4

6

在此示例中,您可以完全放弃该功能,只需执行以下操作:

var custom_type = $('#myDiv').attr('custom_type');

然而,一般来说,您可以使用 IIFE 进行更复杂的“即时”变量赋值计算——如果我需要迭代某些东西,我喜欢使用它们,这样我就可以在i不污染当前范围的情况下使用它们。

但是,在您的第二个示例中,结果完全不同 - 您将需要调用函数custom_type()来获取当前值,而第一段代码将获取其值一次,并且变量将保存该值。

于 2014-04-09T22:53:07.587 回答
3

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';
} 
于 2014-04-09T22:51:42.750 回答
2

您的第一个(IIFE)执行函数并存储其结果,秒存储函数作为定义。

(function(x) {
    return x * 2;
})(5);

您正在像普通函数一样进行调用:func(arg1,arg2),但是您传递整个函数定义而不是函数名称,因此上面将返回10,如:

function multiply(x) {
    return x * 2;
}

multiply(5);

他们的意思是一样的,你在打电话。不太可能第一个,第二个是定义加上一个调用。

于 2014-04-09T22:56:55.400 回答
1

IIFE 允许您在创建时调用函数(匿名或其他)。你看过这个吗? http://benalman.com/news/2010/11/immediately-invoked-function-expression/

于 2014-04-09T22:57:56.777 回答