我从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;
}();
答案 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;
这里的不同之处在于,“自我调用程序”(这是一个错误的描述,它是什么,恕我直言)允许你这样做而不会使名称someSetup
和actualWork
可见调用代码 - 这通常是可取的。
有了解释,让我们回答你的问题:
return
任何内容(即使它分配给a
函数返回 的内容);因此,您的JS IDE报告其返回值为undefined
。actualWork
的引用返回正常(它是赋给a
的值);当您使用a()
成功调用它时,您会看到自己。答案 2 :(得分:2)
a)取决于你的解释器的工作方式,是的,只需运行脚本(通过按回车)定义函数a();
b)它给出了“undefined”,因为程序本身并没有返回任何东西,而是函数a();确实。 你上面引用的代码代表一个函数a();在被调用时,应该执行以下操作:
所以我会通过以下方式使用该程序:
var x=a();
setup=='done'
x();
(由()返回)应显示警告。修改强> 对不起,我没看到}();最后,所以它不是100%正确。 ();最后是 - 正如Jon和Tomasz所说的那样 - 简称“将函数的返回值作为一个新函数并立即运行”。
答案 3 :(得分:1)
undefinded
返回 var a = ...
即可。参考由分配的右侧返回。
答案 4 :(得分:1)
立即调用anonumous函数并返回对其中函数actualWork
的引用。所以a
包含这个引用,可以自己调用。所以a();
会给你提醒。