这个奇怪的 setTimeout 语法是什么?

What is this strange setTimeout syntax?

我 运行 跨过如下代码(实际有效)并且很好奇语法发生了什么。

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

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

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

Is passing a function in quotes with parenthesis valid?

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

现代的方法是:

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

MDN 文档令人困惑。

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

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

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

所以,喜欢你的样本

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

function timeout(a){
    echo a;
}