这两个函数的区别? (“函数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,一旦执行已经超过了分配。

第一个趋向于使用的原因有几个:

  1. 名字“sum”出现在堆栈跟踪中,这使得在许多浏览器中debugging更容易。
  2. 名称“sum”可以在函数体内部使用,这使得recursion函数更容易使用。
  3. 函数声明在javascript中被“挂起”,所以在第一种情况下,函数被保证只能被定义一次。
  4. 分号插入的原因

     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有三种定义函数的方法。

  1. 你的第一个例子是一个函数声明 。 这使用“函数”语句来创build一个函数。 该函数在parsing时可用,可以在该范围内的任何地方调用。 您以后仍然可以将其存储在variables或对象属性中。
  2. 你的第二个片段显示了一个函数expression式 。 这涉及到使用“函数”操作符创build一个函数 – 该运算符的结果可以存储在任何variables或对象属性中。 函数expression式是非常强大的。 函数expression式通常被称为“匿名函数”,因为它不必具有名称,
  3. 定义函数的第三种方法是“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