关于功能的报价

时间:2014-05-04 10:16:54

标签: javascript

刚刚得到一个简短的问题,非常简单,尝试简化答案,因为我是JS的新手。问题是,为什么setTimeout中的函数需要“”按预期运行,这意味着它每5秒触发一次

var pal = document.getElementById("pal");
c=0;

function Tr(){
    pal.innerHTML=c;
    c=c+1;
    setTimeout("Tr()", 5000);
}

4 个答案:

答案 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);