2013-10-03 41 views
1

是什麼VAR的varName = funcname函數(){}

var a = function() {} 

var a = function b() {} 

後者,b爲未定義區別?

+0

@iJay:不,它沒有錯 –

+0

後者將具有'name'屬性,'a.name ==='b'' –

+0

在後者中,b僅在函數內定義,但應該在外部未定義它。目的是允許匿名函數遞歸。老的Mozilla或IE(不記得)有一個bug,其中b在函數外部沒有被定義 - 但遞歸的東西仍然有效。 – slebetman

回答

4

第二個是named anonymous function - 這個名字會出現在一個堆棧跟蹤(否則在堆棧跟蹤會帶您看到的只是「匿名函數」)

+1

中得到解答。從技術上講,它被稱爲a命名函數表達式。它被用來實現遞歸匿名函數,因爲你不再允許在html5嚴格模式下使用arguments.callee – slebetman

+0

@Darhazer:謝謝!如果我打印出a.name,後者將返回「b」。 –

+0

@slebetman:也許你正在考慮JavaScript的嚴格模式,而不是HTML。 –

4

首先是一個匿名函數表達式,第二個命名函數表達式,都在Javascript中有效。

例如,它可以用於遞歸而不使用arguments.callee(不允許在嚴格模式下使用),因爲它引用自身,無論在哪裏。參考範圍是本地唯一的功能,那就是它是不可訪問全球內:可以省略

var a = function b(){ 
    return b; 
}; 
function c() { 
    return c; 
} 
var d = function e() { 
    return e(); 
}; 
d(); // maximum call stack size exceeded :P 
var f = c; 
c = null; 
f(); // null 
a(); // function 
b();// undefined not a function 
b; // not defined 
a()(); // same function again 
+1

您還有一件事從您的例子中忘記了:調用返回的「b」的a()()(在這種情況下本身就是這樣,所以它只是有點愚蠢,但是提供了信息) – slebetman

1
var a = function() {} 

功能名稱。在這種情況下,函數名稱被省略。這些功能稱爲匿名功能。

閱讀關於javascript作用域和匿名函數優點和缺點的細節。