【问题标题】:What is this strange setTimeout syntax?这个奇怪的 setTimeout 语法是什么?
【发布时间】:2015-02-05 16:44:43
【问题描述】:

我遇到了如下代码(实际上有效),我很好奇语法发生了什么。

function timeout(a){
  alert(a);
}

setTimeout('timeout(5)', 2000); //alerts 5 after two seconds

我已经看到指向函数的指针被传递给 setTimeout 以及匿名函数。在带括号的引号中传递函数是否有效?我在 MDN 上找不到任何相关信息。

【问题讨论】:

  • 这是有效的,但通常被认为是一种不好的做法,因为它是 eval 的一种形式。
  • 有效。这是您将具有预设参数值的函数作为回调传递的方式。不过,就像@KevinB 所说的那样,它通常不会受到重视。
  • 注意:MDN 将此语法列为var timeoutID = window.setTimeout(code, [delay]);
  • @JonathanLonowski 错字已更正。

标签: javascript function settimeout


【解决方案1】:

在带括号的引号中传递函数是否有效?

是的,您可以将带有任意代码的字符串传递给setTimeout;它甚至不必是一个函数。这不是一个好主意。对代码进行评估,就好像它在全局范围内一样。

现代的做法是:

setTimeout(timeout.bind(null, 5), 2000);

【讨论】:

  • “在全球范围内”评估它有什么危险?
  • @thomas:我的意思是它不一定是一个函数。例如:setTimeout("location = 'http://stackoverflow.com';", 1000); 将在一秒钟后将location 设置为http://stackoverflow.com
  • @thomas:在全局范围内评估它没有危险,但它往往会让人们感到惊讶,它鼓励创建全局函数(所以你可以这样称呼它们),这是一个坏主意,因为全局命名空间在浏览器上非常拥挤。
【解决方案2】:

MDN 文档令人困惑。

每个人都会犯这个错误:对函数参数使用括号。

但即使在 MDN 上的语法也很清楚:

var timeoutID = scope.setTimeout(function[, delay, param1, param2, ...]);

所以,喜欢你的样本

window.setTimeout(timeout, 1000, 'hello');

function timeout(a){
    echo a;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-18
    • 2011-05-21
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多