传递和分配功能与调用它们

时间:2013-07-28 20:31:00

标签: javascript function

我决定发布这个问题,因为我已经在线阅读了几个教程。以不同的方式对待这个话题。 假设我有一个增加计数器的功能:

function addCounter()
{
    counter++;
}

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

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

3 个答案:

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

jsFiddle

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