JavaScript自我调用功能

时间:2011-03-20 10:48:06

标签: javascript iife

我从Stoyan Stefanov的一本名为Object Oriented JavaScript的书的第79页得到了这个例子。我真的不知道该怎么做,第一次运行这个程序(通过点击回车)它返回'undefined'。之后,按照作者的指示,我将其称为a();并获得警报'Worky worky'

我的问题是

a)我是否正确地完成了第一步?即我打算通过点击“输入/返回”来运行一个自我调用的程序?

b)如果我只是按“输入/返回”来运行程序是正确的,为什么它会给出“未定义”的结果。作者说,该程序将函数actualWork()的引用(在其第一次运行时)退回?如果它返回一个引用,为什么这被认为是未定义的?是不是很重要?

请注意,我尝试在jsfiddle.net中输入代码然后点击运行并且没有发生任何事情,但是当我第一次在控制台中运行它时我得到了“未定义”,然后当我做了一个时(之后的警报) );

var a = function() {
    function someSetup(){
        var setup = 'done';
    }
    function actualWork(){
        alert('Worky-worky');
    }
    someSetup();
    return actualWork;
}();

5 个答案:

答案 0 :(得分:4)

此代码相当于:

var f = function() {
    function someSetup(){
        var setup = 'done';
    }
    function actualWork(){
        alert('Worky-worky');
    }
    someSetup();
    return actualWork;
};

var a = f();

所以:你正在创建变量f并为其分配一个函数。然后,您将调用f()的结果分配给a,这恰好也是一个函数(这在原始代码中隐式完成)。在最后,您可以运行a()f()运行返回功能。

答案 1 :(得分:4)

“自我调用”意味着此代码在编译器执行后立即生效,即使所有代码都在函数内。发生这种情况是因为立即调用了该函数(最后一行中的那些())。

如果你只是写了

,这也会发生什么
function someSetup(){
    var setup = 'done';
}
function actualWork(){
    alert('Worky-worky');
}
someSetup();
return actualWork;

这里的不同之处在于,“自我调用程序”(这是一个错误的描述,它是什么,恕我直言)允许你这样做而不会使名称someSetupactualWork可见调用代码 - 这通常是可取的。

有了解释,让我们回答你的问题:

  1. 代码段本身不会return任何内容(即使它分配给a函数返回 的内容);因此,您的JS IDE报告其返回值为undefined
  2. 对函数actualWork的引用返回正常(它是赋给a的值);当您使用a()成功调用它时,您会看到自己。

答案 2 :(得分:2)

a)取决于你的解释器的工作方式,是的,只需运行脚本(通过按回车)定义函数a();

b)它给出了“undefined”,因为程序本身并没有返回任何东西,而是函数a();确实。 你上面引用的代码代表一个函数a();在被调用时,应该执行以下操作:

  1. 定义2个其他(临时)函数
  2. 运行其中一个(someSetup)
  3. 返回另一个。
  4. 所以我会通过以下方式使用该程序:

    1. 运行以定义a();
    2. 致电var x=a();
    3. (可选)检查setup=='done'
    4. 调用x();(由()返回)应显示警告。
    5. 修改 对不起,我没看到}();最后,所以它不是100%正确。 ();最后是 - 正如Jon和Tomasz所说的那样 - 简称“将函数的返回值作为一个新函数并立即运行”。

答案 3 :(得分:1)

从语句undefinded返回

var a = ...即可。参考由分配的右侧返回。

答案 4 :(得分:1)

立即调用anonumous函数并返回对其中函数actualWork的引用。所以a包含这个引用,可以自己调用。所以a();会给你提醒。