我刚刚准备好用Nodejs弄手,但是在第一个例子中尝试和播放时,我发现了一些我很难理解的行为。
var a = function () {
console.log('print 3');
return 5000;
};
setTimeout( function (){
console.log('print 2');
}, a()
);
console.log('print 1');
上述代码的输出是:
print 3 print 1 print 2
一个愚蠢的疑问是,虽然上面的代码有效,但这个代码却没有。
setTimeout( function (){
console.log('print 2');
}, (function () {console.log('print 3'); return 5000;} )
);
console.log('print 1');
请解释上述行为。
答案 0 :(得分:3)
更好地格式化代码可以帮助您了解正在发生的事情。
var a = function () {
console.log('print 3');
return 5000;
};
setTimeout( function (){
console.log('print 2'); # Executed after 5000 ms.
},
a()); # Executed first and returns 5000
console.log('print 1'); #Executed second
以下代码段不起作用,因为您从未执行该功能的第二部分。
setTimeout( function (){
console.log('print 2');
}, (function () { # Never executed.
console.log('print 3');
return 5000;
} )
);
console.log('print 1');
以下内容可行:
setTimeout( function (){
console.log('print 2');
}, (function () {
console.log('print 3');
return 5000;
} )(); #The brackets () will execute the function.
);
console.log('print 1');
暂且放弃
该示例与node.js无关,并且会在响应控制台的任何浏览器中生成完全相同的结果。
答案 1 :(得分:1)
setTimeout
有两个参数(至少,它按你使用它的方式)。
第一个参数是要调用的函数,第二个参数是在调用之前延迟的时间。
在第一个示例中,您传递了一个匿名函数和一个数字(a()
的返回值)。
在你的第二个例子中,你传递了两个匿名函数(因为你从来没有调用第二个函数(没有()
))。
setTimeout(
function (){
console.log('print 2');
},
(function () {console.log('print 3'); return 5000;})()
);
console.log('print 1');
答案 2 :(得分:1)
您需要调用第二个参数 - setTimeout需要一个数字
setTimeout( function (){
console.log('print 2');
}, (function () {console.log('print 3'); return 5000;} )()
);
console.log('print 1');