0

我很想了解以下之间的区别:

var the_timeout = setTimeout("alert(the_string);", 60000);

和:

  var the_timeout = setTimeout("alert(" + the_string + ");",60000);

我知道第一个传递变量,第二个传递值-但这到底是什么意思,为什么重要?为什么在第二个示例中传递了值?

另外(我希望这是同一个主题),为什么会这样:

var timeout=setTimeout("someFunction();", 3000)

虽然这不是:

var timeout=setTimeout(someFunction(),3000);

调用函数时,someFunction()有效,那么为什么我必须在使用时添加引号setTimeout()?

4

2 回答 2

5

我认为您将按值传递和按引用传递之间的区别与此混淆了。在您提到的示例中,没有区别。

然而,

var timeout=setTimeout("someFunction();", 3000)

工作和:

var timeout=setTimeout(someFunction(),3000);

不是因为在第二种情况下,someFunction()它会运行以便它可以将结果/返回值传递给setTimeout. 这就是为什么你将它作为一个字符串传递,以便它自己setTimeout可以。eval当然,除非 ifsomeFunction()本身返回一个setTimeout可以用作回调的函数。

但是,正如 zerkms 在评论中指出的那样,您应该改为传递回调:

var timeout = setTimeout(function() { someFunction(); }, 3000);

这也具有setTimeout随后可以随时调用回调的效果。一个主要的好处是您可以传递任何常规函数,这样您就可以从您可能正在使用的编辑器中受益,而不是将其全部打包成一个字符串:

var myTrigger = function() {
  someFunction();
};

var timeout = setTimeout(myTrigger, 3000);
于 2013-03-14T23:40:11.230 回答
1

这将在 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导致evaleval导致奇怪的疯狂虫子,奇怪的疯狂虫子导致痛苦,痛苦导致痛苦

相反,您传递一个函数。它在每一个方面都更好。

// 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);
于 2013-03-14T23:55:20.810 回答