JavaScript自调用函数

JavaScript自调用函数,javascript,iife,Javascript,Iife,我从Stoyan Stefanov的《面向对象JavaScript》一书的第79页得到了这个例子。我不知道该怎么办,第一次运行这个程序(按enter键)时,它返回“undefined”。之后,按照作者的指示,我将其命名为a()并收到警报“Worky-Worky” 我的问题是 a) 我第一步做对了吗?i、 我是否应该仅仅通过点击“回车”来运行一个自调用程序 b) 如果我点击“回车”来运行程序是正确的,为什么它会给出一个“未定义”的结果。作者说,这个程序(在第一次运行时)拒绝了对函数actualWo

我从Stoyan Stefanov的《面向对象JavaScript》一书的第79页得到了这个例子。我不知道该怎么办,第一次运行这个程序(按enter键)时,它返回“undefined”。之后,按照作者的指示,我将其命名为
a()并收到警报“Worky-Worky”

我的问题是

a) 我第一步做对了吗?i、 我是否应该仅仅通过点击“回车”来运行一个自调用程序

b) 如果我点击“回车”来运行程序是正确的,为什么它会给出一个“未定义”的结果。作者说,这个程序(在第一次运行时)拒绝了对函数actualWork()的引用?如果它返回一个引用,为什么认为它是未定义的?不知何故,这很重要吗

请注意,我试图在jsfiddle.net中输入代码,然后点击run,但什么也没发生,但是当我第一次在控制台中运行它时,我得到了“未定义”,然后当我执行()时,得到了警报


undefinded
是从语句
var a=…
返回的,这是正常的。引用由assignment的右侧返回。

undefinded
是从语句
var a=…
返回的,这是正常的。引用由assignment的右侧返回。

a)根据解释器的工作方式,是的,只需运行脚本(按return键)即可定义函数a()

b) 它给出了“undefined”,因为程序本身不返回任何东西,只返回函数a();做 上面引用的代码表示函数a();调用时,应执行以下操作:

  • 定义2个其他(临时)功能
  • 运行其中一个(someSetup)
  • 把另一个还给我
  • 因此,我将通过以下方式使用该程序:

  • 运行以定义一个()
  • 调用
    var x=a()
  • (可选)检查设置是否为“完成”
  • 调用
    x()(由()返回)应显示警报
  • 编辑 对不起,我没有看到}();最后,这不是100%正确。第()条;最后,正如Jon和Tomasz所说,“将函数的返回值作为一个新函数,并立即运行它”的缩写形式。是的,根据解释器的工作方式,只需运行脚本(按return键)即可定义函数a()

    b) 它给出了“undefined”,因为程序本身不返回任何东西,只返回函数a();做 上面引用的代码表示函数a();调用时,应执行以下操作:

  • 定义2个其他(临时)功能
  • 运行其中一个(someSetup)
  • 把另一个还给我
  • 因此,我将通过以下方式使用该程序:

  • 运行以定义一个()
  • 调用
    var x=a()
  • (可选)检查设置是否为“完成”
  • 调用
    x()(由()返回)应显示警报
  • 编辑
    对不起,我没有看到}();最后,这不是100%正确。第()条;正如Jon和Tomasz所说,最后是“将函数的返回值作为一个新函数并立即运行它”的缩写形式

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

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

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

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

    返回的函数,立即调用异常函数并返回对其中函数
    实际工作的引用。因此
    a
    包含此引用,并且可以自己调用。So
    a()
    应向您发出警报。

    立即调用anonumous函数,并返回对其中函数
    actualWork
    的引用。因此
    a
    包含此引用,并且可以自己调用。So
    a()
    应向您发出警告。

    自调用”意味着此代码在编译器执行后立即生效,即使所有代码都在函数中。这是因为函数被立即调用(最后一行中的
    ()

    如果你只写一篇文章,这也会发生

    function someSetup(){
        var setup = 'done';
    }
    function actualWork(){
        alert('Worky-worky');
    }
    someSetup();
    return actualWork;
    
    这里的区别在于,“自调用程序”(这是一个糟糕的描述,IMHO)允许您在不让调用代码看到名称
    someSetup
    actualWork
    的情况下执行此操作——这通常是可取的

    下面,让我们回答您的问题:

  • 代码片段本身不返回任何内容(即使它分配给函数返回的某个内容);因此,JSIDE报告其返回值为
    undefined
  • 函数
    actualWork
    的引用返回良好(它是分配给
    a
    的值);当您使用
    a()
    成功调用它时,您自己也看到了这一点
  • “自调用”意味着此代码在编译器执行后立即生效,即使所有代码都在函数中。这是因为函数被立即调用(最后一行中的
    ()

    如果你只写一篇文章,这也会发生

    function someSetup(){
        var setup = 'done';
    }
    function actualWork(){
        alert('Worky-worky');
    }
    someSetup();
    return actualWork;
    
    这里的区别在于“自调用程序”