2011-08-24 44 views
9

我意識到,這是非常有用的(由於性能原因)做這樣的事情......重新分配參數變量的要點是什麼?

function Abc(a, b, c) { 
    var window = window; 

所以,當代碼訪問window,它並不需要去了作用域鏈終於找到window。同樣可以做到對documentnavigator,等...

但我在重寫一些MobiScroll jQuery plugin的過程中,發現這...

function Scroller(elm, dw, settings) { 
    ... 
    var elm = elm; 
    var dw = dw; 
    ... 

什麼是重新初始化的優點elmdw指向他們的參數變量?

我讀過很多關於訪問arguments代價高昂,但從未讀過任何有關爲什麼這可能是好的做法。

這樣做的好處是什麼?

在過去,我從0123n這個構造MDN文檔。

+0

從未見過它。讓引擎擔心「優化」。 – 2011-08-24 01:16:06

+0

@pst我同意。但是,我有一個好奇心... – alex

+1

它或多或少是[Javascript的重複 - 重新分配函數參數中定義的變量時是否需要使用'var'?](http://stackoverflow.com/questions/2495174/javascript-do-need -to-使用-VAR-時-重新分配-A-變量定義的功能於該-FU)。但是,我不知道這些是否是您想要的答案。 –

回答

2
> function Abc(a, b, c) { 
>  var window = window; 

所以,當訪問的代碼窗口,它不需要上去範圍 鏈終於找到窗口。

我不認爲這是原因。對於在全局範圍內聲明的函數,本地與全局解析標識符的速度會微不足道(也許速度取決於瀏覽器)。

腳本可以使用與上述類似的東西,以確保窗口指預期窗口對象而不是其它窗口上作用域鏈,例如

var fn = (function(window) { 

    // In here window is unequivocally a reference to the global object 

}(this)); 

在第二個例子:

> function Scroller(elm, dw, settings) { 
>  ... 
>  var elm = elm; 
>  var dw = dw; 
>  ... 

聲明變量是完全是浪費時間。在函數聲明或表達式的形式參數列表中標識標識符相當於聲明它位於var。將這些標識符聲明爲局部變量不會產生任何影響。

有一個Safari的早期版本,它有一個沒有傳遞值的形式參數問題,但那是很久以前的事了,只是一個非常特殊的情況。

+0

+1感謝RobG,這是一個很好的答案。 – alex

+2

關於答案的第一部分:是的,對於全球職能來說,沒有太大的區別。但是通常函數嵌套在其他函數中,用作回調函數等,並且儘可能接近任何對象是有意義的。它也取決於*訪問某個對象的頻率。經驗法則是,如果您多次訪問屬性或對象,請將其存儲在本地變量中。 –

+0

@Felix King我根本不會使用這個經驗法則 - 我的經驗法則是「......如果它使得代碼更具可讀性/可維護性,那麼......」,它具有「無」與「性能」 「或」計數「。 – 2011-08-24 02:07:36

0

唯一合乎邏輯的原因可能是什麼澄清範圍變量在聲明。

其他然後,它只是增加了多餘的代碼。