我正在学习JavaScript,我最近学习了JavaScript计时事件。当我在W3Schools中了解setTimeout时,我注意到一个以前没有遇到过的奇怪数字。它们使用双引号,然后调用函数。
例子:
setTimeout("alertMsg()", 3000);
我知道JavaScript中的双引号和单引号表示字符串。
我还发现我也可以这样做:
setTimeout(alertMsg, 3000);
带括号的是引用,不带括号的是复制。当我使用引号和括号的时候,它变得很疯狂。
如果有人能向我解释这三种使用setTimeout的方式之间的区别,我将很高兴:
括号括起来:
setTimeout("alertMsg()", 3000);
不带引号和圆括号:
setTimeout(alertMsg, 3000);
第三种是只使用引号:
setTimeout("alertMsg", 3000);
注意:一个更好的setTimeout引用源是MDN。
使用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()的功能,将字符串作为脚本执行,从而使任意且可能有害的脚本执行成为可能。
括号括起来:
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()不工作,因为我们将它放在引号中
没有当事方,因此它被视为字符串。
如果你把字符串作为函数的第一个参数,实际会发生什么
setTimeout(’string’,编号)
当运行时(经过毫秒数之后),第一个参数的值被求值。
基本上它等于
setTimeout(生产厂(’string’),编号)
这是
另一种语法,允许包含字符串而不是函数,在计时器过期时编译并执行。不建议使用此语法,原因与使用eval()存在安全风险相同。
所以你提到的样本不是很好的样本,可能是在不同的语境中给出的,或者只是简单的打字错误。
如果你像这样调用setTimeout(something, number),第一个参数不是字符串,而是指向一个叫做something的指针。如果是字符串,它就会被求值。但如果是函数,函数就会被执行。
jsbin样本