我决定发布这个问题,因为我已经在线阅读了几个教程。以不同的方式对待这个话题。 假设我有一个增加计数器的功能:
function addCounter()
{
counter++;
}
现在我想调用此函数将其值放在其他变量中。以下哪种方法是正确的:
var newcounter = addCounter();
或var newcounter = addCounter;
?
也许这是一个非常基本的问题,不管你信不信,这两种方法都给了我很好的结果,这就是为什么我想知道哪种方法更好,更正常,甚至更好呢!
与setTimeout相同:我使用过setTimeout(myFunction, 1000)
& setTimeout('myFunction()', 1000)
具有相同的结果,那么,在这种情况下使用哪个?
答案 0 :(得分:2)
newcounter = addCounter();
和newcounter = addCounter;
会产生截然不同的结果。我设置了fiddle to show you the different return values。
newcounter = addCounter();
这会将addCounter
的返回值指定为newCounter
。变量counter
递增,不返回任何内容。由于addCounter
不返回任何内容,newcounter
的值为undefined
。当我尝试拨打newCounter()
时,我收到了明显的错误。
newcounter = addCounter;
这会将函数addCounter
指定给newCounter
。本质上,创建了一个指向函数的指针,如果要证明它,调用newCounter.toString()
将返回addCounter
的函数文本。
致电newCounter()
将执行addCounter
并增加counter
。
与之前的两个答案状态一样,setTimeout
的字符串版本不受欢迎。您需要执行以下操作以每秒递增计数器。
setTimeout(addCounter, 1000);
答案 1 :(得分:1)
它不能给你相同的结果。在第一种情况下,当您执行var newcounter = addCounter();
时,newcounter变量将获得undefined
值。默认情况下,JavaScript中的每个函数都返回undefined,除非您通过return
提供一些值。在第二种情况var newcounter = addCounter;
中,您向newcounter插入了对函数对象addCounter的引用。因此,从该步骤开始,您可以通过newcounter()
调用相同的函数。
当你使用setTimeout时,它会得到相同的结果,因为在第一种情况下,你向setTimeout函数提供对myFunction的引用,而setTimeout将在特定的超时周期后运行它。在第二种情况下,您提供的字符串将在超时期限后评估为eval
。不推荐使用第二种情况的原因是因为eval函数慢得多,在某些情况下不太安全。
阅读this
答案 2 :(得分:0)
都不是。该函数不返回任何内容,因此分配其返回值将不会执行任何操作。同样,只是将函数本身分配给变量也不会做任何事情。
在setTimeout
的情况下,你永远不应该传递一个字符串。你可以直接传递一个函数(myFunction
)然后调用它,或者你可以传递一个匿名函数(这样可以更容易地传递参数),例如setTimeout(function() {doSomething(123);},1000);