【问题标题】:JavaScript self-invoking functionJavaScript 自调用函数
【发布时间】:2011-07-19 02:05:47
【问题描述】:

我从 Stoyan Stefanov 所著的 Object Oriented JavaScript 一书的第 79 页得到了这个例子。真的不知道该做什么,我第一次运行这个程序(按回车键)它返回“未定义”。之后,按照作者的指示,我将其命名为 a(); 并收到警报 'Worky worky'

我的问题是

a) 我是否正确执行了第一步?即我是否应该通过点击“进入/返回”来运行一个自我调用程序?

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

请注意,我尝试在 jsfiddle.net 中输入代码,然后点击运行,但什么也没发生,但是当我第一次在控制台中运行它时出现“未定义”,然后当我执行 a( );

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

【问题讨论】:

  • 该函数返回另一个包含警报的函数。所以在调用你的外部函数之后,它将解析为actualWork 被设置为a。然后当您调用a 时,您基本上调用了actualWork 函数,即然后您会收到警报。

标签: javascript iife


【解决方案1】:

这段代码相当于:

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

var a = f();

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

【讨论】:

    【解决方案2】:

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

    如果你只写的话也会发生这种情况

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

    这里的区别在于“自调用程序”(恕我直言,这是一个错误的描述)允许您在不使名称 someSetupactualWork 对调用代码可见的情况下执行此操作 - - 这通常是可取的。

    解释完之后,让我们回答您的问题:

    1. 代码 sn-p 本身不return 任何东西(即使它分配给a 的东西 由函数返回);因此您的 JS IDE 报告其返回值为 undefined
    2. 对函数actualWork 的引用返回正常(这是分配给a 的值);当您使用 a() 成功调用它时,您自己也看到了。

    【讨论】:

      【解决方案3】:

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

      b) 它给出了“未定义”,因为程序本身不返回任何内容,而是返回函数 a();做。 您上面引用的代码代表一个函数 a();当被调用时,它应该执行以下操作:

      1. 定义 2 个其他(临时)函数
      2. 运行其中一个 (someSetup)
      3. 返回另一个。

      所以我会通过以下方式使用该程序:

      1. 运行定义a();
      2. 致电var x=a();
      3. (可选)检查setup=='done'
      4. 调用 x();(由 a() 返回)应该会显示警报。

      编辑 抱歉,我没有看到 }();最后,所以它不是100%正确的。这 ();最后是 - 正如 Jon 和 Tomasz 所说 - “将函数的返回值作为新函数并立即运行”的缩写形式。

      【讨论】:

        【解决方案4】:

        undefinded 是从语句 var a = ... 返回的,没关系。引用由赋值右侧返回。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-12-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-06
            • 1970-01-01
            相关资源
            最近更新 更多