我对javascript中的函数调用有些困惑。有多种方法可以在不同的上下文中调用函数。通常我已经看到了这两种调用函数的方法。
方法1:
$scope.test = function(){
alert("function invoked");
}();
方法2:
$scope.test = function(){
alert("function invoked");
}
$scope.test();
但是,我想知道:
以下代码在性能方面有何不同?
其他标准以及在什么情况下我应该选择这些?
我已经浏览了一些博客,但无法正确理解。
答案 0 :(得分:2)
有很大的不同。
第一个示例创建一个匿名函数,并将$scope.test
设置为该函数的返回值。由于该函数没有返回任何内容,因此方法一将$scope.test
设置为undefined
。
方法2实际上将$scope.test
设置为函数然后调用它。
var f1 = function(){
alert("You'll see this right away! the function is called directly after definition")
}()
alert(f1)
var f2 = function(){
alert("f2 has been called")
}
alert("note, f2 hasn't been actually _called_ yet, just defined.");
f2();

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
答案 1 :(得分:1)
这两个是不同的。第一个将函数的返回值赋给$scope.test
,而第二个将函数的定义赋给$scope.test
。
答案 2 :(得分:0)
我并没有真正看到很多人会在正常情况下使用方法1。但这就是我如何看待这两者之间的差异:
在方法1中,$scope.test
存储调用函数的返回值,隐式返回undefined
,因此$scope.test
为undefined
。
在方法2中,$scope.test
实际存储了对函数的引用,您可以在需要使用$scope.test()
时调用它,但不能对方法1执行相同的操作。
答案 3 :(得分:0)
方法1 ,匿名函数。让我们看看另一个匿名函数:
(function() {
alert('Hello World');
})();
最后两个括号是自动执行部分。它们会使前面括号中的所有内容立即执行。
让我们谈谈对象内外的self-executing anonymous functions:
(function() {
var Person = {
sayHello: function() {
alert('Hello World');
}
}
})();
这里我们有一个自执行的匿名函数,其中包含一个自己的匿名函数。
注意:这是初始化的简称。但是,该名称(
Person
)没有特殊含义。
方法2 ,实际上存储了对该函数的引用,您可以随时调用它。
答案 4 :(得分:0)
几乎没有;您粘贴的代码中没有jQuery usage。
在第一个示例中,您正在执行没有return语句的anonymous function,因此您要为undefined
属性分配$scope.test
值。
在第二个示例中,您将一个函数分配给$scope.test
属性,然后执行该函数。
去查看有关Functions的MDN文档,如果您还有任何疑问,请添加评论。