setTimeout与引号和括号之间的区别

我正在学习JavaScript,并且最近学习了JavaScript时间事件。 当我在W3Schools学习了setTimeout时候,我注意到了一个我以前没有遇到的奇怪的数字。 他们使用双引号,然后调用该函数。

例:

 setTimeout("alertMsg()", 3000); 

我知道JavaScript中的双引号和单引号意味着一个string。

我也看到我可以这样做:

 setTimeout(alertMsg, 3000); 

用括号括起来,没有括号就复制了。 当我使用引号和括号时,它变得疯狂了。

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

用括号括起来:

 setTimeout("alertMsg()", 3000); 

没有引号和括号:

 setTimeout(alertMsg, 3000); 

而第三个只使用引号:

 setTimeout("alertMsg", 3000); 

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

使用setIntervalsetTimeout

您应该传递一个函数的引用作为setTimeoutsetInterval的第一个参数。 该参考可以是以下forms:

  • 一个匿名函数

     setTimeout(function(){/* Look mah! No name! */},2000); 
  • 现有function的名称

     function foo(){...} setTimeout(foo, 2000); 
  • 指向现有函数的variables

     var foo = function(){...}; setTimeout(foo, 2000); 

    请注意,我将“函数中的variables”与“函数名称”分开设置。 variables和函数名称不一定占用相同的名称空间,并且可以互相打开。

传递参数

要调用一个函数并传递参数,可以调用分配给该计时器的callback函数:

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

还有另一种方法将parameter passing给处理程序,但它不是跨浏览器兼容的 。

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

callback上下文

默认情况下,执行时的callback上下文(在定时器调用的函数内部的值)是全局对象window 。 如果你想改变它,使用bind

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

安全

尽pipe这是可能的,但是你不应该把一个string传给setTimeout或者setInterval 。 传递一个string使得setTimeout()或者setInterval()使用类似于eval()的函数来执行string作为脚本 ,使得任意的和潜在有害的脚本执行成为可能。

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

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

完全同意约瑟夫。

这里是一个小提琴来testing这个: http : //jsfiddle.net/nicocube/63s2s/

在小提琴的背景下,string参数不起作用,在我看来,因为函数没有在全局范围中定义。