Javascript setTimeout在传递代码时等待,但在传递引用时不等待
为什么这样传递代码(由“”包围)时:Javascript setTimeout在传递代码时等待,但在传递引用时不等待,javascript,settimeout,Javascript,Settimeout,为什么这样传递代码(由“”包围)时: setTimeout('alert("James Blunt is bad")', 5000); 在显示我们都知道的内容和传递函数引用之前,是否有5秒钟的停顿: setTimeout('alert("James Blunt is bad")', 5000); setTimeout(alert("James Blunt is bad"), 5000); 没有停顿 如果是第二个示例,您没有传递函数 您正在调用警报并传递其返回值(警报的返回值不是函数) 函数
setTimeout('alert("James Blunt is bad")', 5000);
在显示我们都知道的内容和传递函数引用之前,是否有5秒钟的停顿:
setTimeout('alert("James Blunt is bad")', 5000);
setTimeout(alert("James Blunt is bad"), 5000);
没有停顿
如果是第二个示例,您没有传递函数 您正在调用
警报
并传递其返回值(警报
的返回值不是函数)
函数引用不会以(…)
或者,在浏览器支持较弱的情况下,将数组中的参数作为第三个参数传递给setTimeout:
setTimeout(alert, 5000, ["Hello, world"]);
如果是第二个示例,那么您没有传递函数 您正在调用
警报
并传递其返回值(警报
的返回值不是函数)
函数引用不会以(…)
或者,在浏览器支持较弱的情况下,将数组中的参数作为第三个参数传递给setTimeout:
setTimeout(alert, 5000, ["Hello, world"]);
使用代码参数调用setTimeout时,必须将其包装在函数中:
setTimeout(function () { alert("James Blunt is bad"); }, 5000);
否则,当JavaScript执行
setTimeout
时,它将立即运行警报
函数,希望警报
将返回一个函数对象,然后该函数对象可以进入超时队列。(显然,alert
不会返回函数。)使用代码参数调用setTimeout时,必须将其包装到函数中:
setTimeout(function () { alert("James Blunt is bad"); }, 5000);
否则,当JavaScript执行
setTimeout
时,它将立即运行警报
函数,希望警报
将返回一个函数对象,然后该函数对象可以进入超时队列。(显然,alert
不会返回函数。)在第二个示例中,您正在调用alert
函数,然后调用setTimeout
。这是因为函数的参数是在调用函数之前处理的。(如果alert有一个返回值,并且您希望将该值作为参数传递给另一个函数,那么这正是您想要的行为。)
您要做的是将一个匿名函数传递给setTimeout
,然后让该匿名函数调用alert
,如下所示:
setTimeout('alert("James Blunt is bad")', 5000);
setTimeout(function() {
alert("James Blunt is bad");
}, 5000);
在第二个示例中,您正在调用
alert
函数,然后调用setTimeout
。这是因为函数的参数是在调用函数之前处理的。(如果alert有一个返回值,并且您希望将该值作为参数传递给另一个函数,那么这正是您想要的行为。)
您要做的是将一个匿名函数传递给setTimeout
,然后让该匿名函数调用alert
,如下所示:
setTimeout('alert("James Blunt is bad")', 5000);
setTimeout(function() {
alert("James Blunt is bad");
}, 5000);
你也打败我了,回答得好。我要补充的唯一一件事可能是这个参考-。他们也很好地解释了这一点。DOH,现在你说得很明显。+1用于添加“并且警报的返回值不是函数”。大多数人都忽略了这一点,但这是理解结果为何出乎意料的重要部分。你也打败了我,回答得好。我要补充的唯一一件事可能是这个参考-。他们也很好地解释了这一点。DOH,现在你说得很明显。+1用于添加“并且警报的返回值不是函数”。大多数人忽略了这一点,但这是理解结果为何出乎意料的一个重要部分,