2016-05-14 44 views
1

隨着陣列解構,有可能通過插入逗號前沒有一個參考丟棄主導項:爲什麼我不能跳過函數簽名中的參數賦值?

const [ , two ] = [ 1, 2 ] 

同樣不函數簽名的真實 - 下面的代碼將不解析因爲在前導逗號簽名是意想不到的:

function ditchFirstArgument(, second){} 

爲什麼我需要爲ES6函數表達式中的引用參數提供引用?

+4

你在找什麼樣的答案? 「因爲語言不允許」?如果您要求*設計決策的理由*,SO並不是一個好的選擇(因爲這裏的大多數人不會使用ECMAScript) –

+1

這會導致極其專業化的功能,而且重用性極差。甚至更糟:這些函數的命名將是一場噩夢:D – rand

+0

嗨費利克斯,我讚賞大多數人沒有設計Javascript,但仍然認爲堆棧溢出將是一個很好的地方獲得技術解釋爲什麼語言不會讓我這樣做。我完全期望許多SO用戶不會有答案 - 這很好:) – Barney

回答

3

爲什麼我需要爲ES6函數表達式中的主要參數提供參考?

因爲否則它會是一個語法錯誤。不僅僅是ES6,而是任何版本的語言,你都不能忽略形式參數,因爲規範沒有提供它。

如果你真的想這樣做(但爲什麼呢?),你可以把它寫成

function ditchFirstArgument(...[, second]) {} 

,或者至少,你將能夠在將來的某個ES版本;見https://github.com/tc39/ecma262/commit/d322357e6be95bc4bd3e03f5944a736aac55fa50。 Chrome似乎已經支持這個功能。同時,你能做的最好的是

function ditchFirstArgument(...args) { 
    const [, second] = args; 

但爲什麼規範不允許的參數,省音?

你應該去問誰寫它的人,但他們可能甚至從來沒有考慮過,或者如果他們這麼做,拒絕它,因爲它是容易出錯的,幾乎沒有必要的,而且很容易被周圍的工作使用虛擬形式參數如_

+1

需要注意的是,如果使用lodash或下劃線,則可能需要使用'__'(兩個下劃線),因此它不會影響全局'_'(單下劃線)變量。 – Sukima

1

我相信這是一個常見的模式來命名以下劃線未使用的變量:

function ditchFirstArgument(_, second) { /* ... */ } 

雖然它不會阻止你實際使用這個變量(如在Go),這似乎是一個非常簡單的解決方法。

1

Roman's insight從圍棋是有用的,但不恰當的JS那裏令牌_is a valid reference,通常使用由Underscore後來Lodash庫。

即使這是可以接受的,你也必須爲每個未使用的參數創建和避免衝突引用,這是不理想的。

但是,有可能將destructure a function argument轉換爲空對象,它可以在沒有參考的情況下有效地使參數無效。

function take_third({}, {}, third){ 
    return third 
} 
相關問題