Javascript 这个奇怪的setTimeout语法是什么?
我遇到了下面这样的代码(这实际上是可行的),我很好奇语法是怎么回事Javascript 这个奇怪的setTimeout语法是什么?,javascript,function,settimeout,Javascript,Function,Settimeout,我遇到了下面这样的代码(这实际上是可行的),我很好奇语法是怎么回事 function timeout(a){ alert(a); } setTimeout('timeout(5)', 2000); //alerts 5 after two seconds 我已经看到指向函数的指针被传递给setTimeout和匿名函数。传递带括号的引号中的函数是否有效?我在MDN上找不到任何关于它的信息 传递带括号的引号中的函数是否有效 是的,您可以将带有任意代码的字符串传递到setTimeout;它甚至
function timeout(a){
alert(a);
}
setTimeout('timeout(5)', 2000); //alerts 5 after two seconds
我已经看到指向函数的指针被传递给setTimeout和匿名函数。传递带括号的引号中的函数是否有效?我在MDN上找不到任何关于它的信息
传递带括号的引号中的函数是否有效
是的,您可以将带有任意代码的字符串传递到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;
}
它是有效的,但通常被认为是一种不好的做法,因为它是一种评估形式。它是有效的。这就是如何将带有预设参数值的函数作为回调传递。正如@KevinB所说,它通常不会受到高度重视。注意:MDN将此语法列为..@JonathanLonowski打字错误更正。在“全局范围”对其进行评估有什么危险?@thomas:我的意思是它不必是函数。例如:
setTimeout(“location=”)http://stackoverflow.com';", 1000);代码>将位置设置为http://stackoverflow.com
过一秒钟。@thomas:在全局范围内对其进行评估没有危险,但它往往会让人感到惊讶,并且它鼓励创建全局函数(因此您可以这样调用它们),这是一个坏主意,因为全局名称空间在浏览器上非常拥挤。