Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这个奇怪的setTimeout语法是什么?_Javascript_Function_Settimeout - Fatal编程技术网

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:在全局范围内对其进行评估没有危险,但它往往会让人感到惊讶,并且它鼓励创建全局函数(因此您可以这样调用它们),这是一个坏主意,因为全局名称空间在浏览器上非常拥挤。