2017-06-22 141 views
0

一位同事勸我加入"use strict";到我的JS代碼頂部突出顯示在我的定義和潛在的引用錯誤,等等。我很高興與它的任何差距,因爲它有確定了幾條可能成爲問題的代碼。「使用嚴格」和函數命名參數來調用

然而,另一位同事勸我,叫其多個參數的函數時,它可以幫助作爲指定他們命名的參數,尤其是如果它像一堆布爾值。爲了說明,這裏的一對夫婦的函數調用:

logData(data, target, preserveLog=true, changeClass=false, wrapLine=false); 

...比更清晰一大堆:

logData(data, target, true, false, false); 

"use strict";討厭這一點。無論我在哪裏,我都會在控制檯中看到一個參考錯誤。它仍然運行良好,正如預期的那樣,但控制檯現在混雜着所有這些顯然沒有定義的參考。

有沒有人知道是否有辦法解決這個問題,這樣我就可以保持我的同事們欣賞的編碼約定,或者我將不得不停止使用"use strict";或者查看所有代碼並刪除參數名稱?

謝謝。

+0

那麼,嚴格的模式是正確的。這是一個可怕的做法。你在各處將價值滲透到全局變量中。不要這樣做。 – Bergi

+1

如果你想使用「命名參數」,[傳遞對象](https://stackoverflow.com/a/11796776/1048572)。 – Bergi

+0

@Bergi謝謝,我可以改變一些更長的電話採取對象。 –

回答

3

但是,另一位同事告訴我,當調用帶多個參數的函數時,可以根據指定的參數命名這些參數,特別是在類似一堆布爾值的情況下。

這是可怕的意見!

Javascript實際上並不支持按名稱傳遞參數。您通過「名稱」傳遞的每個參數實際上都被視爲對具有該名稱的全局變量的分配,並且"use strict"正確地將其識別爲錯誤。

如果你想成爲什麼值要傳遞,將值賦給實局部變量,並通過這些更加清晰,例如

var preserveLog = true; 
var changeClass = false; 
var wrapLine = false; 
logData(data, target, preserveLog, changeClass, wrapLine); 

如果你真的想使用你原來的模式繼續,你甚至可以分配給在函數調用這些變量,只要首先聲明爲局部變量:

var preserveLog, changeClass, wrapLine; 
logData(data, target, preserveLog=true, changeClass=false, wrapLine=false); 

(有一個帽子提示到dav_ithis answer, which I based my recommendation off of。)

+0

感謝 - 公平地說,我認爲他指的是C#。我最近才被轉移到一個JavaScript項目上,並假設我在C#中學到的東西會在一定程度上繼承下去。不是,在這種情況下,我想。 –

+1

使用局部變量名有助於記住參數意味着什麼,但我們不能忘記它仍然是一個位置參數。 – Bergi

2

Duskwuff has already provided an excellent answer我不會添加任何東西,除了說我完全同意它,但他沒有提到任何conventi由於ES6而產生。

在ES6,你還沒有命名的參數,但你必須退而求其次,這是Object destructuring assignment

這讓我們傳遞什麼似乎被命名參數,但實際上只是解構是永遠不會直接使用對象的對象屬性。

在您所提供的示例的情況下,它會是這個樣子:

logData({data, target, preserveLog:true, changeClass:false, wrapLine:false}); 

凡函數定義爲:

function logData({data, target, preserveLog, changeClass, wrapLine}) { ... } 

我已經看到了很多圖書館的那更喜歡ES6可用的這種調用約定,並且它也非常方便,因爲參數的順序也不再重要。

相關問題