2015-09-21 85 views
0

例如,當我將一個函數指定爲對象聲明的屬性時,我的Webpack加載器(它是babel-loader)將自動添加一個函數名稱?舉例來說,假設我有以下的比較功能:將函數名稱添加到對象聲明中的好處是什麼?

var utils = { 
    compare: function (a, b) { 
    if (parseFloat(a[0]) - parseFloat(b[0]) === 0) { 
     return parseFloat(a[1]) - parseFloat(b[1]); 
    } 
    else { 
     return parseFloat(a[0]) - parseFloat(b[0]); 
    } 
    } 
} 

的WebPack將其編譯爲以下幾點:

var utils = { 
    compare: function compare(a, b) { 

    if (parseFloat(a[0]) - parseFloat(b[0]) === 0) { 
     return parseFloat(a[1]) - parseFloat(b[1]); 
    } else { 
     return parseFloat(a[0]) - parseFloat(b[0]); 
    } 
    } 
} 

[對比:功能(A,B)已更改爲比較:功能比較(a,b)]

+0

這對調試很有用,但寫起來很痛苦。 – elclanrs

+0

這不是webpack,但它是一個加載器 – zerkms

+0

@elclanrs你會友好地詳細說明嗎? –

回答

1

在您發佈的問題中的代碼確實沒有什麼好處。但是,要遞歸調用一個匿名函數,你需要給它一個名字(至少在更新版本的javascript中)。這個語法有一個名字。它被稱爲named function expression

在舊版本的javascript中,arguments對象具有名爲.callee的屬性,該屬性引用該函數。這可以用來遞歸到一個匿名函數:

var sum = function(numbers){ 
    var n = numbers.pop(); 
    if (numbers.length) { 
     return n + arguments.callee(numbers); 
    } 
    return n; 
} 

arguments.callee屬性已在ES5被棄用。因此,在目前(及更新版本)版本的JavaScript,你需要使用一個命名函數表達式做一個匿名函數的遞歸:

var sum = function s (numbers){ 
    var n = numbers.pop(); 
    if (numbers.length) { 
     return n + s(numbers); 
    } 
    return n; 
} 

注意的是,根據該規範,名稱的命名功能表達式對函數本身是私有的。因此,在無錯誤的JavaScript解釋器/編譯器中,上述第二個示例不應在匿名函數sum()之外創建名爲s()的函數。但是,一些ES4實現(舊版瀏覽器)已知會被破壞,並且會創建s()sum()。除了名稱泄漏之外,在過去10年左右發佈的所有瀏覽器中都使用了命名函數表達式語法。

1

這只是一個好的做法,爲調試和遞歸目的命名所有函數。 Babel在加載程序的代碼上執行該操作,這不是Webpack的工作。

相關問題