2008-09-22 99 views

回答

48

第一被稱爲一個命名的函數,其中第二已知爲匿名函數。

關鍵的實際區別在於何時可以使用求和函數。例如: -

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還沒有被分配的功能。

在執行開始之前,命名函數被解析並分配給它們的名稱,這就是爲什麼命名函數可以在其定義之前的代碼中被取消。

通過代碼分配函數的變量顯然只能用作函數,一旦執行已經通過賦值。

6

第一個是一個命名的函數語句,第二個將一個匿名函數表達式賦值給一個變量。

函數語句添加到其範圍立即 - 你並不需要能夠調用它之前運行,所以這個工程:

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; 
} 

但是,這可能會造成混淆,因爲這兩個名字實際上是在不同的範圍,並參考不同的東西。

-5

他們的意思是完全一樣的東西。這只是語法糖。後者是國際海事組織更多地揭示了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 
12

第一個往往被用於以下幾個原因:

  1. 名稱「和」在 堆棧跟蹤,這使得調試 更容易在許多瀏覽器顯示出來。
  2. 名稱 「sum」可以在 函數體中使用,這使得它更容易使用 用於遞歸函數。
  3. 函數聲明在javascript中被「懸掛」爲 ,所以在第一種情況下, 函數保證爲 定義了一次。
  4. 分號插入引起

    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; } 
    } ... 
+0

關於if語句的好處。但我不認爲這個函數確實只能被定義一次。 (或者,也許我誤解了你?) – 2008-09-22 12:45:07

1

不同的是...

這是一個匿名函數

var sum = function (x, y) { 
    return x+y; 
} 

所以,如果你警報(總和);你拿 「功能(X,Y){返回X + Y;}」(無名) 雖然這是一個名爲功能:

function sum(x, y) { 
     return x+y; 
} 

如果警報(總和);現在你拿「功能總和(X,Y){返回X + Y;}」(名字是和)

有命名的函數幫助,如果您使用的是分析器,因爲分析器可以告訴你的功能總和的執行時間......諸如此類,而不是一個未知功能的執行時間......諸如此類

0

這裏是一個其他例子: 功能即sayHello(name){警報('你好」 +名)}

現在,假設你想修改一個按鈕的onclick事件,比如它說「hello world」

你不能寫:

yourBtn。onclik = sayHello('world'),因爲你必須提供一個函數引用。

然後你可以使用第二種形式: yourBtn.onclick = function(){sayHello('workld'); }

ps:抱歉我的英文不好!

3

您發佈的兩個代碼片段幾乎適用於所有用途,它們的行爲方式都是相同的。

但是,行爲的差異在於,對於第二個變體,只能在代碼中的該點之後調用該函數。

使用第一個變體,該函數可用於聲明函數上方的代碼。

這是因爲在第二個變體中,函數在運行時分配給變量foo。首先,函數在解析時被分配給該標識符foo。

更多的技術信息

JavaScript有定義函數的三種方式。

  1. 您的第一個示例是函數聲明。這使用「功能」語句來創建一個函數。該功能在解析時可用,並可在該範圍內的任何地方調用。您以後仍可以將其存儲在變量或對象屬性中。
  2. 您的第二個片段顯示函數表達式。這包括使用「函數」運算符來創建函數 - 該運算符的結果可以存儲在任何變量或對象屬性中。函數表達式非常強大。函數表達式通常稱爲「匿名函數」,因爲它不必具有名稱,定義函數的第三種方法是「Function()」構造函數,它不會顯示在原始文章中。不建議使用它,因爲它與eval()相同,因爲它有問題。