setTimeout带引号和不带括号的区别

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

例子:

setTimeout("alertMsg()", 3000);

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

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

setTimeout(alertMsg, 3000);

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

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

括号括起来:

setTimeout("alertMsg()", 3000);

不带引号和圆括号:

setTimeout(alertMsg, 3000);

第三种是只使用引号:

setTimeout("alertMsg", 3000);

注意:setTimeout引用的更好来源是中数

436711 次浏览

使用setIntervalsetTimeout

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

  • 匿名函数

    setTimeout(function(){/* Look mah! No name! */},2000);
    
  • A name of an existing function

    function foo(){...}
    
    
    setTimeout(foo, 2000);
    
  • A variable that points to an existing function

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

    请注意,我将“函数中的变量”与“函数名”分开设置。变量和函数名占用相同的名称空间并可能相互攻击,这并不明显。 < / p >

传递参数

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

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

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

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

回调中

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

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

安全

虽然这是可能的,你应该不传递字符串setTimeoutsetInterval。传递字符串使setTimeout()setInterval()使用类似eval()以脚本形式执行字符串的功能,使任意和潜在有害的脚本执行成为可能。

完全同意约瑟夫的观点。

这里有一个小提琴来测试这个: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.
});

括号括起来:

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' number)

是在运行时(经过numberof毫秒之后)计算的第一个参数的值。 基本上它等于

setTimeout (eval('string') number)

这是

另一种语法,允许包含字符串而不是函数,在计时器过期时编译并执行。不建议使用此语法,原因与使用eval()存在安全风险相同。

所以你提到的样本不是很好的样本,可能是在不同的语境中给出的,或者只是简单的打字错误。

如果你像这样调用setTimeout(something, number),第一个参数不是字符串,而是指向something的指针。同样,如果something是字符串-那么它将被求值。但如果是函数,函数就会被执行。 jsbin样本 < / p >
    ##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.