可能重複:
JavaScript: var functionName = function() {} vs function functionName() {}這兩個函數的區別? ( 「功能X」 與 「變種X =功能」)
有什麼區別:
function sum(x, y) {
return x+y;
}
// and
var sum = function (x, y) {
return x+y;
}
爲什麼一個使用過另一個?
可能重複:
JavaScript: var functionName = function() {} vs function functionName() {}這兩個函數的區別? ( 「功能X」 與 「變種X =功能」)
有什麼區別:
function sum(x, y) {
return x+y;
}
// and
var sum = function (x, y) {
return x+y;
}
爲什麼一個使用過另一個?
第一被稱爲一個命名的函數,其中第二已知爲匿名函數。
關鍵的實際區別在於何時可以使用求和函數。例如: -
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;
}
將失敗,因爲在時間的第一行已經執行變量sum還沒有被分配的功能。
在執行開始之前,命名函數被解析並分配給它們的名稱,這就是爲什麼命名函數可以在其定義之前的代碼中被取消。
通過代碼分配函數的變量顯然只能用作函數,一旦執行已經通過賦值。
第一個是一個命名的函數語句,第二個將一個匿名函數表達式賦值給一個變量。
函數語句添加到其範圍立即 - 你並不需要能夠調用它之前運行,所以這個工程:
var y = sum(1, 2);
function sum(x, y) {
return x + y;
}
但函數表達式只分配給變量執行代碼時,所以這不起作用:
// 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;
}
表達形式的好處是,你可以用它來在不同的點分配不同的功能來表達 - 這樣你就可以改變功能,或者在不同的條件下使用不同的(例如取決於正在使用的瀏覽器)。
命名函數語句的一個優點是調試器將能夠顯示名稱。雖然,您可以命名函數表達式:
var sum = function sum(x, y) {
return x + y;
}
但是,這可能會造成混淆,因爲這兩個名字實際上是在不同的範圍,並參考不同的東西。
他們的意思是完全一樣的東西。這只是語法糖。後者是國際海事組織更多地揭示了JavaScript的真正作用;即,「總和」僅僅是一個變量,具有功能對象,然後可以通過別的東西代替初始化:
$ 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
第一個往往被用於以下幾個原因:
分號插入引起
var f = function (x) { return 4; }
(f)
分配4至f
。
雖然有一些注意事項要記住。 不要在IE 6做
var sum = function sum(x, y) { ... };
,因爲它會導致被創建了兩個函數對象。特別是如果你
var sum = function mySym(x, y) { ... };
根據標準, 函數sum(X,Y)混淆{...} 不能出現內部的,如果塊或循環體,所以不同的解釋將把
if (0) {
function foo() { return 1; }
} else {
function foo() { return 2; }
}
return foo();
不同。 在這種情況下,你應該做的
var foo;
if (0) {
foo = function() { return 1; }
} ...
關於if語句的好處。但我不認爲這個函數確實只能被定義一次。 (或者,也許我誤解了你?) – 2008-09-22 12:45:07
不同的是...
這是一個匿名函數
var sum = function (x, y) {
return x+y;
}
所以,如果你警報(總和);你拿 「功能(X,Y){返回X + Y;}」(無名) 雖然這是一個名爲功能:
function sum(x, y) {
return x+y;
}
如果警報(總和);現在你拿「功能總和(X,Y){返回X + Y;}」(名字是和)
有命名的函數幫助,如果您使用的是分析器,因爲分析器可以告訴你的功能總和的執行時間......諸如此類,而不是一個未知功能的執行時間......諸如此類
這裏是一個其他例子: 功能即sayHello(name){警報('你好」 +名)}
現在,假設你想修改一個按鈕的onclick事件,比如它說「hello world」
你不能寫:
yourBtn。onclik = sayHello('world'),因爲你必須提供一個函數引用。
然後你可以使用第二種形式: yourBtn.onclick = function(){sayHello('workld'); }
ps:抱歉我的英文不好!
您發佈的兩個代碼片段幾乎適用於所有用途,它們的行爲方式都是相同的。
但是,行爲的差異在於,對於第二個變體,只能在代碼中的該點之後調用該函數。
使用第一個變體,該函數可用於聲明函數上方的代碼。
這是因爲在第二個變體中,函數在運行時分配給變量foo。首先,函數在解析時被分配給該標識符foo。
更多的技術信息
JavaScript有定義函數的三種方式。
不使用名稱函數,只是使用匿名函數進行封裝,防止全局範圍的變量污染 – 2014-06-11 13:30:36