2012-04-26 93 views
1

我在JavaScript文件中有大約10個函數。在開始的每個功能有如下語句:

var $me = $(this); 

它會更好,在全球範圍內定義$me,然後在每個函數的開頭重新定義?或者它沒有任何區別?例如...

var $me; 
function doo() {$me = $(this)} 
function foo() {$me = $(this)} 
// etc. etc. 
+0

不,這不會更好。沒有理由爲什麼'$ me'應該在函數之間「共享」,每個函數都有自己的'$ me',所以在本地是有意義的。此外,更長的範圍鏈使得變量查找更慢(理論上)。 – 2012-04-26 22:48:45

+0

我會投票反對全球範圍。爲了便於閱讀,以及如果您計劃稍後將功能分解爲模塊。 – Christophe 2012-04-26 22:50:00

回答

1

你應該永遠不會實現你與全局定義$me秒選項,但覆蓋在每一個地方的功能。這是一場災難。如果一個函數調用另一個函數(或觸發一個事件處理程序),則$me將被覆蓋,並且會在第一個函數中受到適當的影響。不 - 不要這樣做。

正確的方法是在每個使用它的函數中定義一個新的局部變量。這樣既快又不易覆蓋錯誤。僅供參考,本地變量比全局變量訪問速度更快。

如果你需要的$(本)在函數中保存的副本,然後放:

var $me = $(this); 

附近的函數(函數體內)的頂部,這是一個臨時的局部變量。

0

我可以想到保持變量局部和使其成爲全局之間的唯一區別是你污染了全局空間。

如果你喜歡它的全球無論出於何種原因,我建議做

(function() { 
    var $me; 
    function doo() { $me = $(this); } 
})(); 

代替,以保持$me範圍被真正的全球性。

但是,一個重要的考慮因素是,如果您只聲明一個$me,並且您調用另一個函數,它也會設置$me,那麼您將遇到麻煩。

最後,更有意義$me是局部的,因爲它僅適用於它在功能,誰是$me函數調用之外?

+0

我仍然投票不這樣做。 'var $ me = $(this)'很簡單,不需要它是全局的,或者這個問題是沒有意義的。 – 2012-04-26 22:49:20

0

如果這些是全局函數,則可能完全不需要「我」變量。該構造通常用於對象的成員函數中。當你定義一個將被別人調用的函數時,這個函數很有用,但是這個函數需要一個對你的原始對象的引用。例如,在這裏我們定義了一個匿名函數將被setTimeout的調用:

{ 
    foo: function() { 
    var me = this; 
    setTimeout(function() { 
     me.bar(); 
    }, 1000); 
    }, 
    bar: function() { 
    } 
} 
+1

看起來更像是函數用作事件處理程序或其他jQuery方法回調函數,其中'this'引用DOM元素。避免一遍又一遍調用'$(this)'是有道理的。 – 2012-04-26 22:51:37