传递变量VS传递值

时间:2013-03-14 23:37:06

标签: javascript variables timeout

我很想了解之间的区别:

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

2 个答案:

答案 0 :(得分:5)

我认为你混淆了传值和传递参考之间的区别。在你提到的例子中,没有区别。

然而,

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

答案 1 :(得分: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);