setTimeout - 如何避免使用字符串进行回调?

tee*_*yay 12 javascript settimeout

使用时setTimeout,必须将要执行的代码放入字符串中:

setTimeout('alert("foobar!");', 1000);
Run Code Online (Sandbox Code Playgroud)

但是,我想执行一个函数,我在变量中有一个引用.我希望能够这样做:

var myGreatFunction = function() { alert("foobar!"); };
// ...
setTimeout('myGreatFunction();', 1000);
Run Code Online (Sandbox Code Playgroud)

(虽然在现实生活中,警报是一段较长的代码,并myGreatFunction作为参数传递给其他函数,在其中setTimeout调用它.)

当然,当超时触发时,myGreatFunction不是已识别的功能,因此它不会执行.

我希望javascript让我这样做,但它没有:

setTimeout(function() { myGreatFunction(); }, 1000);
Run Code Online (Sandbox Code Playgroud)

这周围有一个很好的方式吗?

Ste*_*son 29

如果您不需要myGreatFunction使用任何参数调用,您应该能够传递setTimeout函数引用:

setTimeout(myGreatFunction, 1000);
Run Code Online (Sandbox Code Playgroud)

此外,您应该始终避免传递setTimeout它需要评估的代码(当您将代码包装在引号中时会发生这种情况).相反,将代码包装在匿名函数中:

setTimeout(function() {
    // Code here...
}, 1000);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Mozilla开发中心setTimeout页面.

史蒂夫


Kir*_*tan 14

谁说它不让你这么做?

它确实,代码 -

setTimeout(function() { myFunction(); }, 1000);
Run Code Online (Sandbox Code Playgroud)

完全有效.

  • 哈哈 - 是的,你是对的.一个不相关的错误意味着我的功能似乎没有被调用.这使我处于一个有点尴尬的位置,想要对我自己的问题进行投票...... (9认同)