2013-04-12 24 views
6

我最近遇到源這個模式來爲https://github.com/yeoman/generator-webapp在JavaScript中分配變量時使用命名函數的目的是什麼?

AppGenerator.prototype.packageJSON = function packageJSON() { 
    this.template('_package.json', 'package.json'); 
}; 

什麼是佈施的功能名稱「packageJSON」當你將它分配給一個變量或對象反正財產的目的是什麼?我一直在類似的情況下使用匿名函數。

+0

否則,該功能在控制檯中將沒有名稱,並且您將難以跟蹤誰在呼叫接下來的內容。 – Joseph

+0

這是我的第一個想法,但它不會出現在它分配給它的對象屬性的名稱下並從中調用嗎? – FriendOfFuture

+0

這個名字是不是仍然會被JS代碼縮減器像closure或uglify重新分配? – FriendOfFuture

回答

6

用於調試目的。如果您使用命名函數,則可以在您最喜愛的開發工具中的調用堆棧跟蹤中看到該名稱。否則,你會看到。

+0

給你答案,因爲這幾乎肯定是*爲什麼*它正在完成。 – FriendOfFuture

0

這就是所謂的named function expression(或NFE),它使調試過程更容易。

需要記住的一個重要細節是,該名稱僅在 中提供了新定義函數的作用域;規範任務,一個 標識符不應該適用於一個封閉範圍:

var f = function foo(){ 
    return typeof foo; // "foo" is available in this inner scope 
}; 
// `foo` is never visible "outside" 
typeof foo; // "undefined" 
f(); // "function" 
0

正如其他人說,主要用於調試的目的。但不僅如此。例如,你可以依靠這樣一個事實,即在函數體內,你可以使用你設置的名字來訪問函數本身。舉一個愚蠢的例子:

var sum = function (a, b) { 
    if (a < 3) 
     return sum(3 + a, b); 

    return a + b; 
} 

sum(1, 2) // 3; 

但是讓我們看看現在發生了什麼:

var aSum = sum; 
sum = null; 

aSum(1, 3); // TypeError: sum is not a function 

命名功能,將覆蓋該用例:

var sum = function sum(a, b) { 
    if (a < 3) 
     return sum(3 + a, b); 

    return a + b; 
} 

sum(1, 2) // 6 

var aSum = sum; 
sum = null; 

aSum(1, 2) // 6 

這是因爲在體內該函數,該函數的名稱總是引用它,而不是從另一個作用域中取出,就像第一個示例一樣。

相關問題