带有和不带引号和括号的setTimeout之间的区别

use*_*123 235 javascript settimeout

我正在学习JavaScript,最近我学到了关于JavaScript计时事件的知识.当我setTimeoutW3Schools学习时,我注意到一个奇怪的人物,我之前没有遇到过.他们使用双引号然后调用该函数.

例:

setTimeout("alertMsg()", 3000);
Run Code Online (Sandbox Code Playgroud)

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

我也看到我可以这样做:

setTimeout(alertMsg, 3000);
Run Code Online (Sandbox Code Playgroud)

用括号表示,没有括号,它被复制.当我使用引号和括号时,它变得疯狂.

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

括号:

setTimeout("alertMsg()", 3000);
Run Code Online (Sandbox Code Playgroud)

没有引号和括号:

setTimeout(alertMsg, 3000);
Run Code Online (Sandbox Code Playgroud)

第三个是仅使用引号:

setTimeout("alertMsg", 3000);
Run Code Online (Sandbox Code Playgroud)

注意:更好的setTimeout参考来源是MDN.

Jos*_*eph 378

使用setIntervalsetTimeout

您应该将对函数的引用作为setTimeoutor 的第一个参数传递setInterval.该引用可以采用以下形式:

传递参数

要调用函数并传递参数,可以在分配给定时器的回调中调用函数:

setTimeout(function(){
  foo(arg1, arg2, ...argN);
}, 1000);
Run Code Online (Sandbox Code Playgroud)

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

setTimeout(foo, 2000, arg1, arg2, ...argN);
Run Code Online (Sandbox Code Playgroud)

回调上下文

默认情况下,执行时回调的上下文(this计时器调用的函数内部的值)是全局对象window.如果您想更改它,请使用bind.

setTimeout(function(){
  this === YOUR_CONTEXT; // true
}.bind(YOUR_CONTEXT), 2000);
Run Code Online (Sandbox Code Playgroud)

安全

虽然它是可能的,但你不应该将字符串传递setTimeoutsetInterval.将字符串传递使setTimeout()setInterval()使用一个类似的功能,eval()执行字符串作为脚本,使得任意的和潜在的有害脚本执行可能的.

  • 永远不会复制@ user1316123函数.与对象和数组相同.它们[通过引用传递](http://snook.ca/archives/javascript/javascript_pass).你应该停止阅读w3schools.[他们弊大于利](http://w3fools.com/) (41认同)
  • @JosephtheDreamer函数_are_对象."函数名称"和"引用函数的变量"是_same_事物.此外,你可以直接将参数传递给setTimeout(不需要为它包装一个lambda(尽管你说 - 更新的浏览器).而且,问题不在于让用户执行脚本(他们总是可以这样做),它是通过接受_other_用户的输入并运行_that_作为脚本.用户自己总是可以打开控制台并执行任意JavaScript. (4认同)
  • 我没有意识到你需要使用setTimeout函数才能正常工作.谢谢你清理它. (2认同)