2010-11-22 97 views
12

它總是有意義的,我在這裏使用它。 什麼是替代?我怎麼能一般避免使用它們,並且最重要的是爲什麼它根據jsLint使用全局變量是不好的。爲什麼globals不好?

(function($){ 
    $(function(){ 
    $body = $('body'); //this is the BAD Global 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 

你能幫我理解嗎?並給我一個更好的解決方案?

回答

18

全局是不好的,因爲它們不會引起問題的時候了。只有在以後,當你在所有地方使用它們之後,它們將導致非常難看的問題 - 如果不從頭開始編寫代碼,就無法解決問題。

示例:您使用$body來定義某些功能。這工作正常。但最終,你也需要一個價值。所以你使用$body.foo。工作正常。然後,您添加$body.bar。然後,幾周後,您需要另一個值,以便添加$body.bar

你測試的代碼,它似乎工作。但事實上,你已經「添加」了相同的變量兩次。這不成問題,因爲JavaScript不理解「一次創建新變量」的概念。它只是知道「創造,除非它已經存在」。所以你使用你的代碼,最終,一個函數將修改$body.bar打破另一個功能。即使發現問題也會花費您很多時間。

這就是爲什麼最好確保只有在需要的情況下才能看到變量。這樣,一個功能不能打破另一個功能。隨着代碼的增長,這變得更加重要。

2

你應該使用var $身體來定義它,然後它會在該函數的範圍內的地方,沒有無功也可能被大家所覆蓋

(function($){ 
    $(function(){ 
    var $body = $('body'); //this is the local variable 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 
+0

或者覆蓋一些名爲$ body – Mchl 2010-11-22 14:22:56

+0

的全局變量yes,但在本例中它將替換全局值,這樣它只會隱藏在函數的作用域 – mpapis 2010-11-22 14:24:42

+2

函數文字使用聲明的局部變量與函數定義的範圍相同被稱爲[closure](http://jibbering.com/faq/notes/closures/),並且應該在jQuery中廣泛使用以達到很好的效果。 – Phrogz 2010-11-22 14:27:42

2

Globale變量可以與其他腳本衝突或者被覆蓋。當你不需要全球化時,建議避開它們。只需使用var(或let如果你的JS-版本,支持大於1.7):

(function() { 
    var foo = 'bar'; 
    alert(foo); 
})(); 
2

你可以重寫爲

var $body = $('body'); 

這(使用var關鍵字)將使它一個局部變量,這足以滿足您的需求。它仍將在您的each回調範圍內。

使用全局變量很糟糕的原因是它可以被其他任何東西覆蓋。爲了您的代碼能夠很好地擴展,它取決於您使用的其他腳本。最好儘可能使腳本儘可能自給自足,儘可能少地依賴指向它之外的世界。

0

jsLint非常嚴格。這可能沒有必要太過於擔心。

但是,如果你覺得不好,你可以做到這一點,就像你如何作用域jQuery

(function($){ 
    $(function(){ 
    $.each(somearray ,(function($body){ $body.dosomething() })($('body')); 

    if (something){ 
    $('body').somethingelse(); 
    } 

    }); 
}(jQuery)); 
+3

我同意通常沒有必要對jsLint所說的所有事情都進行研究,但在這種情況下,我不會提到這一點,因爲我真的同意,如果全局變量可以無痛地避免,那麼它們應該是,而且在此代碼變量可以聲明爲局部變量,並且不需要其他操作。 – 2010-11-22 14:26:50

+0

@David Hedlund:同意 – kizzx2 2010-11-22 14:35:58

相關問題