2017-04-03 70 views
3

我最近遇到了一個JavaScript腳本,其中作者似乎試圖避免他的代碼中的字符串,並將所有內容都分配給一個變量。避免字符串和硬編碼函數名稱 - 優勢?

所以不是

document.addEventListener('click', (e) => { /*whatever*/ }); 

他會寫

var doc = document; 
var click = 'click'; 
var EventListener = 'EventListener'; 
var addEventListener = `add${EventListener}`; 
doc[addEventListener](click, (e) => { /*whatever*/ }); 

雖然緩存document到一個變量可以被視爲微的優化,我真的不知道是否有這種做法的其他任何好處一般來說 - 可測試性,速度,維護,什麼?

傳統的IE attachEvent應該已經差不多了,所以能夠快速讓腳本在這些環境下運行,我認爲這並不是一個好處。

+3

也許他害怕失去工作,並寫下只能由他維護的代碼...... :-) – baao

+1

這對我來說似乎很奇怪 - 儘管避免[魔術字符串](https:///en.wikipedia.org/wiki/Magic_string),並且將字符串存儲在字符串可能會更改的變量中,但語義「var」名稱將保持不變是很好的做法,我無法想象如何執行前端Web工作'click'會改變,或者'document'會以某種方式成爲不同的對象...... –

+1

版權陷阱,也許? – Schlaus

回答

1

你給的例子看起來很奇怪,我無法想象大多數這些舉動的任何「良好實踐」理由。我的第一個猜測是,這是一個不確定自己在做什麼的人的工作,但他們也會使用ECMAScript 6語法很奇怪。

另一種可能性是這是生成的代碼(例如某種可視化編程工具的輸出,或者縮小器)。在這種情況下,通常會看到這種過度分解,因爲代碼是從保守編寫的模板生成的,以防止出現錯誤;我正在考慮C語言中的預處理宏的方式使用括號。

有時候,變量聲明是以一種方式寫入的,它向變量(和編譯器和/或讀者)說明該變量保存了什麼類型的數據。例如,asm.js代碼使用不必要的變量聲明作爲在常規JS上實現強類型變量的技巧。有時,聲明是以文檔形式編寫的(如果您看到var foo = Math.PI * 0,則可能是foo是以弧度表示的角度,因爲否則作者將只寫入var foo = 0.0)。但這仍然不能解釋像var click='click'