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 。
使用setInterval
或setTimeout
您应该传递一个函数的引用作为setTimeout
或setInterval
的第一个参数。 该参考可以是以下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参数不起作用,在我看来,因为函数没有在全局范围中定义。