3

我决定发布这个问题是因为我已经在线学习了几个教程并以不同的方式处理这个主题。假设我有一个增加计数器的函数:

function addCounter()
{
    counter++;
}

现在我想调用这个函数把它的值放在其他变量中。以下哪种方式是正确的: var newcounter = addCounter();var newcounter = addCounter;?也许这是一个非常基本的问题,但信不信由你,这两种方法都给了我很好的结果,这就是为什么我想知道哪种方法更好,正常,甚至更好,正确!

与 setTimeout 相同:我使用setTimeout(myFunction, 1000)&setTimeout('myFunction()', 1000)得到相同的结果,那么,在这种情况下使用哪个?

4

3 回答 3

2

newcounter = addCounter();并且 newcounter = addCounter;应该产生非常不同的结果。我设置了一个小提琴来向您展示不同的返回值

newcounter = addCounter();

这将返回值分配给addCounterto newCounter。变量counter递增并且不返回任何内容。由于addCounter不返回任何内容,newcounter因此具有 的值undefined。当我尝试打电话时,newCounter()我得到一个明显的错误。

newcounter = addCounter;

这会将函数分配addCounternewCounter。本质上,创建了一个指向函数的指针,如果你想证明它,调用newCounter.toString()返回的函数文本addCounter

调用newCounter()将执行addCounter并递增counter


与前两个答案状态一样,字符串版本的setTimeout不受欢迎。您需要执行以下操作以每秒递增计数器。

setTimeout(addCounter, 1000);

js小提琴

于 2013-07-28T21:28:12.683 回答
1

它不能给你同样的结果。在第一种情况下,当你这样做时var newcounter = addCounter();newcounter 变量将收到undefined值。默认情况下,JavaScript 中的每个函数都返回 undefined,除非您通过return. 在第二种情况下var newcounter = addCounter;,您在 newcounter 中插入对函数对象 addCounter 的引用。因此,从该步骤开始,您只需调用相同的函数newcounter()

当您使用 setTimeout 时,它会得到相同的结果,因为在第一种情况下,您向 setTimeout 函数提供对 myFunction 的引用,并且 setTimeout 将在特定超时时间后运行它。在第二种情况下,您提供一个字符串,该字符串将eval在超时时间之后进行评估。不建议使用第二种情况的原因是因为 eval 函数在某些情况下要慢得多并且不那么安全。读这个

于 2013-07-28T20:49:08.523 回答
0

两者都不。该函数不返回任何内容,因此分配其返回值不会做任何事情。同样,仅将函数本身分配给变量也不会做任何事情。

在 的情况下setTimeout,您永远不应该传递字符串。您可以直接传递一个函数 ( myFunction) 并调用它,也可以传递一个匿名函数(这样更容易传递参数),例如setTimeout(function() {doSomething(123);},1000);

于 2013-07-28T20:35:19.703 回答