2017-07-08 20 views
0

我經常看到的JavaScript代碼,像這樣的變量:「var d = document;」它真的有用嗎?

var w = window, 
    d = document, 
    e = d.documentElement, 
    g = d.body; 

w.addEventListener('resize', function() { 
    ... 
    d.querySelectorAll(...); 
    ... 
}); 

我只是不知道是否有在使用這些類型的變量的興趣? (除了減少代碼量,如果有很多調用「文檔」或「窗口」) 我認爲答案是否定的,但以防萬一......

+1

縮小...沒有其他好的重新生成 – adeneo

+1

是的,如果你不得不重複50x的對象 – PRMoureu

+1

但降低可讀性。如果'var d'作爲本地變量的某個地方,也容易出現錯誤 – frozen

回答

2

答案是肯定的,不是。您使用它們的方式,不,沒有好處,因爲您的代碼不使用ge

您的代碼使這些變量成爲全局變量,應該避免使用全局變量。我們可以通過將我們的代碼包裝在立即調用的函數表達式(IIFE)中來創建包圍變量的包裝器。但是,由於現在存在一個間接層,因此必須通過沿着「作用域鏈」找到它們的定義來解決對較高作用域中元素的引用。

如果您要將對全局(或更高範圍的)對象的引用傳遞到較小的作用域中,則可以稍微提高性能,因爲您將本地引用較高作用域對象並避免必須遍歷作用域鏈。所以,如果你這樣做:

(function(w, d){ 
    // Within this function w and d are local references to global objects 
    w.addEventListener('resize', function() { 
    ... 
    d.querySelectorAll(...); 
    ... 
    }); 

}(window, document)); 

然後,有這些聲明(實際上這裏的論點)是有道理的。

此外,你必須「解決」的對象引用任何時候,你拿更少的步驟來解決這些問題,性能越好,所以當:

var w = window; 
var d = document; 

不是特別有用,因爲兩者都是總是全局可用,這些

var g = document.body; 
var e = document.documentElement; 

是因爲你必須要查找存儲在bodydocumentElement屬性的對象有用,你已經採取了「打」在解決bodydocumentElement DOM對象只有一次,但稍後您可以直接訪問它們而無需一次又一次地解析它們。

+0

好吧,謝謝你的答案!現在更清楚了。 –

-1

是的,它是非常有用的,當你寫var d=document,您存儲這個變量,如果你想使用這個變量與 method

例,這使得它更容易文檔裏面:

var d = new Date() 
document.write(d.getHours()) 

在這裏,您將new Date()存儲在d變量中,這樣可以更輕鬆地在其他地方使用它。

+0

你誤解了這個問題。並且,不,您不是將文檔存儲在變量中。您只需存儲可找到對象的內存地址。最後,你的代碼可以寫成:'document.write(new Date())'。如果你不需要繼續訪問該對象,爲它創建一個變量不會爲你購買任何東西。 –

+0

我總是忘記第一點,即地址被存儲而不是文件。謝謝你解釋! –

0

如果您覺得它對您有幫助,它非常有用。

有些人正在使用它作爲編寫程序時減少字符數的捷徑。

對我來說,降低可讀性並將變量添加到全局範圍可能會導致一些不可預測的問題。