我正在学习JavaScript,我最近学习了JavaScript计时事件。当我在W3Schools中了解setTimeout时,我注意到一个以前没有遇到过的奇怪数字。它们使用双引号,然后调用函数。
例子:
setTimeout("alertMsg()", 3000);
我知道JavaScript中的双引号和单引号表示字符串。
我还发现我也可以这样做:
setTimeout(alertMsg, 3000);
带括号的是引用,不带括号的是复制。当我使用引号和括号的时候,它变得很疯狂。
如果有人能向我解释这三种使用setTimeout的方式之间的区别,我将很高兴:
括号括起来:
setTimeout("alertMsg()", 3000);
不带引号和圆括号:
setTimeout(alertMsg, 3000);
第三种是只使用引号:
setTimeout("alertMsg", 3000);
注意:一个更好的setTimeout引用源是MDN。
括号括起来:
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("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样本