【问题标题】:JavaScript anonymous function expression vs IIFEJavaScript 匿名函数表达式 vs IIFE
【发布时间】:2014-05-23 09:57:15
【问题描述】:

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

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

通常我会这样写:

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

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

【问题讨论】:

  • 第一个执行函数并存储结果,秒存储函数作为定义。
  • 第一个相当于var custom_type = $('#myDiv').attr('custom_type')。所以这两个例子都有不同的结果(在第一个例子中,custom_type 是一个字符串,而在第二个例子中它是一个函数)并且没有上下文就不可能知道为什么使用第一个。大概写代码的人不希望custom_type 成为一个函数。

标签: javascript anonymous-function iife function-expression


【解决方案1】:

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】:

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

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

    但是,一般而言,您可以使用 IIFE 进行更复杂的“即时”变量赋值计算 - 如果我需要迭代某些东西,我喜欢使用它们,所以我可以拥有 i 而不会污染当前范围。

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

    【讨论】:

    • 我想这是一个更好的问题,为什么 IIFE 而不是直接将其分配给 .attr 返回值。看起来不必要的复杂。
    【解决方案3】:

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

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

    你正在像普通函数一样调用:func(arg1, arg2),但是你传递整个函数定义而不是函数名,所以上面会返回 10,比如:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2015-02-19
        • 2017-01-11
        • 1970-01-01
        • 2016-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 2012-09-27
        相关资源
        最近更新 更多