刚刚得到一个简短的问题,非常简单,尝试简化答案,因为我是JS的新手。问题是,为什么setTimeout中的函数需要“”按预期运行,这意味着它每5秒触发一次
var pal = document.getElementById("pal");
c=0;
function Tr(){
pal.innerHTML=c;
c=c+1;
setTimeout("Tr()", 5000);
}
答案 0 :(得分:1)
它并不要求它在引号中。但如果它在引号中,那么它是eval
,这很糟糕。但如果它在引号中需要()
,但如果它不是一个字符串,那么它就不应该有它。
你可以这样做:
setTimeout(Tr, 5000);
setTimeout
接收函数作为其参数执行。如果它是按函数的名称传递的,那么它会被直接调用,但是如果给它一个字符串,它将使用eval
来评估它。
不要使用字符串,因为它使用eval
邪恶 !!!
答案 1 :(得分:1)
因为与其他语言(如c#)相反,您无法在JavaScript中传递带参数作为参数的函数调用。您可以传递无参数函数。
传入包含参数化函数调用的字符串或要执行的多个函数,引擎会在运行时对其进行求值。
请参阅setTimeout - how to avoid using string for callback?,了解可以使用无参数函数作为参数。
答案 2 :(得分:1)
它没有,实际上不推荐在引号中使用它,因为它使用eval()
。
The MDN defines window.setTimeout
as the following:
var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
var timeoutID = window.setTimeout(code, delay);
<强>,其中强>
timeoutID
是超时的数字ID,稍后可以使用window.clearTimeout()func
是延迟毫秒后要执行的函数 备用语法中的code
是您希望在延迟毫秒后执行的一串代码(建议不要使用此语法,原因与使用eval()
相同)
因此使用函数
setTimeout(Tr, 5000)
和
setTimeout(function() { Tr(); });
两者都可以正常工作。
如果您想在呼叫中使用参数,则使用具有匿名功能的后者 - 例如:
var foo = 'bar';
setTimeout(function() { Tr('foo' + foo); }); // Will call Tr('foobar')
原因
setTimeout(Tr(), 5000)
不起作用是因为它首先执行Tr()
然后使用结果调用setTimeout
。如果Tr()
返回了字符串'foo'
,则此调用将调用setTimeout('foo', 5000)
,这没有任何意义。
答案 3 :(得分:0)
setTimeout
接受一个函数对象。所以你需要在没有引号和函数调用括号的情况下调用它。
setTimeout(Tr, 5000);