JavaScript自调用函数
我从Stoyan Stefanov的《面向对象JavaScript》一书的第79页得到了这个例子。我不知道该怎么办,第一次运行这个程序(按enter键)时,它返回“undefined”。之后,按照作者的指示,我将其命名为JavaScript自调用函数,javascript,iife,Javascript,Iife,我从Stoyan Stefanov的《面向对象JavaScript》一书的第79页得到了这个例子。我不知道该怎么办,第一次运行这个程序(按enter键)时,它返回“undefined”。之后,按照作者的指示,我将其命名为a()并收到警报“Worky-Worky” 我的问题是 a) 我第一步做对了吗?i、 我是否应该仅仅通过点击“回车”来运行一个自调用程序 b) 如果我点击“回车”来运行程序是正确的,为什么它会给出一个“未定义”的结果。作者说,这个程序(在第一次运行时)拒绝了对函数actualWo
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()代码>(由()返回)应显示警报
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
包含此引用,并且可以自己调用。Soa()
应向您发出警报。立即调用anonumous函数,并返回对其中函数actualWork
的引用。因此a
包含此引用,并且可以自己调用。Soa()
应向您发出警告。自调用”意味着此代码在编译器执行后立即生效,即使所有代码都在函数中。这是因为函数被立即调用(最后一行中的()
)
如果你只写一篇文章,这也会发生
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;
这里的区别在于“自调用程序”