我正在学习JavaScript,我最近学习了JavaScript计时事件。当我在W3Schools中了解setTimeout时,我注意到一个以前没有遇到过的奇怪数字。它们使用双引号,然后调用函数。

例子:

setTimeout("alertMsg()", 3000);

我知道JavaScript中的双引号和单引号表示字符串。

我还发现我也可以这样做:

setTimeout(alertMsg, 3000);

带括号的是引用,不带括号的是复制。当我使用引号和括号的时候,它变得很疯狂。

如果有人能向我解释这三种使用setTimeout的方式之间的区别,我将很高兴:

括号括起来:

setTimeout("alertMsg()", 3000);

不带引号和圆括号:

setTimeout(alertMsg, 3000);

第三种是只使用引号:

setTimeout("alertMsg", 3000);

注意:一个更好的setTimeout引用源是MDN。


当前回答

完全同意约瑟夫的观点。

这里有一个小提琴来测试这个:http://jsfiddle.net/nicocube/63s2s/

在小提琴的上下文中,字符串参数不起作用,在我看来,因为函数没有在全局作用域中定义。

其他回答

我认为你写的setTimeout函数没有运行。 如果你使用jquery,你可以通过这样做让它正确运行:

    function alertMsg() {
      //your func
    }

    $(document).ready(function() {
       setTimeout(alertMsg,3000); 
       // the function you called by setTimeout must not be a string.
    });

使用setInterval或setTimeout

您应该将一个引用作为setTimeout或setInterval的第一个参数传递给函数。参考资料可采用以下形式:

一个匿名函数 setTimeout(function(){/*看!没有名字!* /}, 2000); 现有函数的名称 函数foo(){…} setTimeout (foo, 2000); 指向现有函数的变量 Var foo = function(){…}; setTimeout (foo, 2000); 请注意,我将“函数中的变量”与“函数名”分开设置。变量和函数名占用相同的名称空间并可能相互攻击,这并不明显。

传递参数

要调用一个函数并传递参数,你可以在分配给计时器的回调函数中调用这个函数:

setTimeout(function(){
  foo(arg1, arg2, ...argN);
}, 1000);

还有另一个方法可以将参数传递到处理程序中,但是它不跨浏览器兼容。

setTimeout(foo, 2000, arg1, arg2, ...argN);

回调中

默认情况下,执行时的回调上下文(this值在计时器调用的函数中)是全局对象窗口。如果你想改变它,使用bind。

setTimeout(function(){
  this === YOUR_CONTEXT; // true
}.bind(YOUR_CONTEXT), 2000);

安全

尽管这是可能的,但不应该将字符串传递给setTimeout或setInterval。传递字符串使setTimeout()或setInterval()使用类似于eval()的功能,将字符串作为脚本执行,从而使任意且可能有害的脚本执行成为可能。

完全同意约瑟夫的观点。

这里有一个小提琴来测试这个:http://jsfiddle.net/nicocube/63s2s/

在小提琴的上下文中,字符串参数不起作用,在我看来,因为函数没有在全局作用域中定义。

括号括起来:

setTimeout("alertMsg()", 3000); // It work, here it treat as a function

不带引号和圆括号:

setTimeout(alertMsg, 3000); // It also work, here it treat as a function

第三种是只使用引号:

setTimeout("alertMsg", 3000); // It not work, here it treat as a string

function alertMsg1() { alert("message 1"); } function alertMsg2() { alert("message 2"); } function alertMsg3() { alert("message 3"); } function alertMsg4() { alert("message 4"); } // this work after 2 second setTimeout(alertMsg1, 2000); // This work immediately setTimeout(alertMsg2(), 4000); // this fail setTimeout('alertMsg3', 6000); // this work after 8second setTimeout('alertMsg4()', 8000);

在上面的例子中,第一个alertMsg2()函数立即调用 给出超时4S,但它不打扰)之后,alertms1 () (A 等待时间2秒)然后alertMsg4()(等待时间8秒)但是 alertMsg3()不工作,因为我们将它放在引号中 没有当事方,因此它被视为字符串。

    ##If i want to wait for some response from server or any action we use setTimeOut.

    functionOne =function(){
    console.info("First");

    setTimeout(()=>{
    console.info("After timeOut 1");
    },5000);
    console.info("only setTimeOut() inside code waiting..");
    }

    functionTwo =function(){
    console.info("second");
    }
    functionOne();
    functionTwo();

## So here console.info("After timeOut 1"); will be executed after time elapsed.
Output:
******************************************************************************* 
First
only setTimeOut() inside code waiting..
second
undefined
After timeOut 1  // executed after time elapsed.