gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:13:02 25 4
gpt4 key购买 nike

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

例子:

setTimeout("alertMsg()", 3000);

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

我也看到我可以这样做:

setTimeout(alertMsg, 3000);

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

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

带括号:

setTimeout("alertMsg()", 3000);

没有引号和括号:

setTimeout(alertMsg, 3000);

第三个只使用引号:

setTimeout("alertMsg", 3000);

注意:setTimeout 引用的更好来源是 MDN .

最佳答案

使用 setIntervalsetTimeout

您应该传递对函数的引用作为 setTimeoutsetInterval 的第一个参数。此引用可能采用以下形式:

  • 匿名函数

    setTimeout(function(){/* Look mah! No name! */},2000);
  • 现有函数的名称

    function foo(){...}

    setTimeout(foo, 2000);
  • 指向现有函数的变量

    var foo = function(){...};

    setTimeout(foo, 2000);

    请注意,我将“函数中的变量”与“函数名”分开设置。变量和函数名称占用相同的命名空间并可能相互破坏并不明显。

传递参数

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

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

还有另一种方法可以将参数传递给处理程序,但是 it's not cross-browser compatible .

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

回调上下文

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

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

安全

虽然有可能,但您应该not pass a stringsetTimeoutsetInterval。传递字符串使 setTimeout()setInterval() 使用类似于 eval() 的功能那executes strings as scripts ,使任意且可能有害的脚本执行成为可能。

关于javascript - 带和不带引号和括号的 setTimeout 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10312963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com