这将在 60 秒后解析执行字符串中的代码。
var the_string = "Hello";
setTimeout("alert(the_string);", 60000);
the_string = "Goodbye";
这意味着alert(the_string)
被执行,就像它是常规代码一样。所以它会提醒“再见”。这是因为当最终执行代码时,the_string
会使用更新后的值,因为您正在传递变量。
但这做了一些微妙的不同。
var the_string = "Hello";
setTimeout("alert(" + the_string + ");",60000);
the_string = "Goodbye";
现在我们正在动态创建一个新的代码片段。我们正在创建的片段是alert(Hello);
. 但是Hello
是一个没有价值的变量,因为你没有得到正确的引号。
但是可以说你的意思是:
var the_string = "Hello";
setTimeout("alert('" + the_string + "');",60000);
the_string = "Goodbye";
现在这将起作用,因为它生成的代码是alert('Hello');
. 乍一看似乎做同样的事情。但是因为生成的代码现在实际上包含一个硬编码的字符串,所以当the_string
更改时,更改不会将其变为生成的代码,因为它已被硬编码到代码段中。
基于此,这很简单:
setTimeout("someFunction();", 3000)
字符串中的代码在延迟后执行。在这种情况下,someFunction()
执行。
但这是完全不同的:
setTimeout(someFunction(),3000);
在这种情况下,someFunction()
立即执行,它的返回值作为第一个参数传递给setTimeout()
函数。所以它根本不会做你所期望的。
其中大部分eval
与生成代码的怪癖有关,setTimeout(string,delay)
就像eval
. 如果您不使用eval
,并且没有将字符串传递给 ,这一切都不是问题setTimeout()
。
传递一个字符串会setTimeout
导致eval
,eval
导致奇怪的疯狂虫子,奇怪的疯狂虫子导致痛苦,痛苦导致痛苦。
相反,您传递一个函数。它在每一个方面都更好。
// pass an anonymous function to run some code later
var the_string = "Hello";
setTimeout(function() {
alert(the_string);
}, 60000);
the_string = "Goodbye";
// alerts "Goodbye" 60 seconds later
// pass an anonymous function to run some code
setTimeout(function() {
someFunction();
}, 3000);
// or pass a reference to a function to execute, note lack of ()
setTimeout(someFunction, 3000);