这两个函数的区别? (“函数x”与“var x =函数”)
可能重复:
JavaScript:var functionName = function(){} vs function functionName(){}
有什么区别:
function sum(x, y) { return x+y; } // and var sum = function (x, y) { return x+y; }
为什么一个用于另一个?
第一个被称为命名函数,其中第二个被称为匿名函数。
关键的实际区别在于何时可以使用求和function。 例如:-
var z = sum(2, 3); function sum(x, y) { return x+y; }
z
被分配5,而这个: –
var z = sum(2, 3); var sum = function(x, y) { return x+y; }
由于当时第一行已经执行了variables总和还没有被赋值的function。
在执行开始之前,命名函数被parsing并分配给它们的名字,这就是为什么命名函数可以在其定义之前的代码中被隐藏的原因。
variables分配一个function的代码可以清楚地只能作为function,一旦执行已经超过了分配。
第一个趋向于使用的原因有几个:
- 名字“sum”出现在堆栈跟踪中,这使得在许多浏览器中debugging更容易。
- 名称“sum”可以在函数体内部使用,这使得recursion函数更容易使用。
- 函数声明在javascript中被“挂起”,所以在第一种情况下,函数被保证只能被定义一次。
-
分号插入的原因
var f = function (x) { return 4; } (f)
给
f
赋4。
有几个需要注意的事项。 不要做
var sum = function sum(x, y) { ... };
在IE 6上,因为它会导致创build两个函数对象。 特别困惑,如果你这样做
var sum = function mySym(x, y) { ... };
根据标准,函数sum(x,y){…}不能出现在if块或循环体内部,所以不同的解释器会处理
if (0) { function foo() { return 1; } } else { function foo() { return 2; } } return foo();
不同。 在这种情况下,你应该这样做
var foo; if (0) { foo = function () { return 1; } } ...
第一个是一个命名的函数语句,第二个将一个匿名函数expression式赋给一个variables。
函数语句被立即添加到它的作用域中 – 在调用它之前不需要运行它,所以这个工作原理:
var y = sum(1, 2); function sum(x, y) { return x + y; }
但是函数expression式只在代码执行时赋值给variables,所以这是行不通的:
// Error here because the function hasn't been assigned to sum yet. var y = sum(1, 2); var sum = function(x, y) { return x + y; }
expression式的一个优点是你可以用它来为不同的expression点分配不同的函数 – 所以你可以改变函数,或者在不同的条件下使用不同的函数(比如取决于使用的浏览器)。
命名函数语句的一个优点是debugging器将能够显示名称。 虽然,你可以命名函数expression式:
var sum = function sum(x, y) { return x + y; }
但这可能会令人困惑,因为这两个名字实际上处于不同的范围,并且指的是不同的事物。
您发布的两个代码片段几乎可以用于所有目的,行为方式相同。
但是,行为的差异在于,对于第二个变体,只能在代码中的该点之后调用该函数。
对于第一个变体,该函数可用于在声明函数上方运行的代码。
这是因为在第二个变体中,函数在运行时被分配给variablesfoo。 首先,函数在parsing时被分配给该标识符foo。
更多的技术信息
JavaScript有三种定义函数的方法。
- 你的第一个例子是一个函数声明 。 这使用“函数”语句来创build一个函数。 该函数在parsing时可用,可以在该范围内的任何地方调用。 您以后仍然可以将其存储在variables或对象属性中。
- 你的第二个片段显示了一个函数expression式 。 这涉及到使用“函数”操作符创build一个函数 – 该运算符的结果可以存储在任何variables或对象属性中。 函数expression式是非常强大的。 函数expression式通常被称为“匿名函数”,因为它不必具有名称,
- 定义函数的第三种方法是“Function()”构造函数 ,它不会显示在原始文章中。 不build议使用这个,因为它与eval()有相同的方式,这有其问题。
不同的是…
这是一个无名的function
var sum = function (x, y) { return x+y; }
所以如果你提醒(总和); 你得到“函数(x,y){返回x + y;}”(无名)虽然这是一个命名函数:
function sum(x, y) { return x+y; }
如果你提醒(总和); 现在你得到“函数sum (x,y){return x + y;}”(name是sum)
命名函数有助于如果使用分析器,因为分析器可以告诉你函数sum的执行时间等等,而不是未知函数的执行时间…等等
这里是另一个例子:function sayHello(name){alert('hello'+ name)}
现在,假设你想修改一个button的onclick事件,比如说“hello world”
你不能写:
yourBtn.onclik = sayHello('world'),因为你必须提供一个函数引用。
那么你可以使用第二种forms:yourBtn.onclick = function(){sayHello('workld'); }
Ps:抱歉我的英文不好!
他们的意思是完全一样的东西。 这只是句法糖。 后者是国际海事组织更多地揭示了JavaScript究竟在做什么; 即“sum”只是一个variables,用一个函数对象初始化,然后可以用别的东西代替:
$ js js> function sum(x,y) { return x+y; } js> sum(1,2); 3 js> sum=3 3 js> sum(1,2); typein:4: TypeError: sum is not a function js> sum 3