传递变量VS传递值



我很想了解以下两者的区别:

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()?时添加引号

我想你混淆了按值传递和按引用传递之间的区别。在你提到的例子中,没有区别。

然而,

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

作品:

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

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

但是,正如zerkms在注释中指出的那样,您应该传递回调:

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

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

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

这将在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会导致怪异的疯狂bug,怪异的疯狂bug会导致痛苦,痛苦会导致痛苦

而不是传递一个函数。它在各个方面都更好。

// 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);

相关内容

  • 没有找到相关文章

最新更新