2013-02-24 176 views
0

問:你會如何命名位於另一個函數內部的函數中的本地範圍?JavaScript函數中的範圍變量

讓我解釋一下:

我在與我想要使用的命名約定的麻煩。這裏有一個簡單的例子:

!function($, window, undefined) { 
    var Variables = {}; 
    Variables.X = 1; 

    function myFunction() { 
     var local = {}; 
     local.X = 2; 
     $('.myClass').each(function() { 
      var local = {}; 
      local.X = 3; 
     }); 
    } 
}(jQuery, window); 

現在,我已經決定,我將使用名爲「變量」的對象,以容納那些功能之間的任何共享的所有對象。如果您願意,全局範圍僅限於outer!function(){}定義內。

我決定使用名爲「local」的對象來容納函數內的所有對象。我的問題是函數內部函數的作用域。我想我必須以某種方式合併功能的名稱,以使其具有獨特性。我知道在這個微不足道的例子中,local.X是兩個單獨的變量。但我想單獨命名它們,以便人們更容易讀取它們。我不想6個月後回來,想知道local.X是什麼。

增加問題是它是一個匿名函數,所以沒有函數名稱可以使「局部範圍」唯一標識。我可能必須制定一條規則,如果在回調函數中需要一個變量,則給回調函數一個名稱並將本地範圍與該名稱綁定(以某種方式)。

+2

我明白你的問題(變量陰影),但我不明白你想要做什麼以及爲什麼。 – 2013-02-24 20:04:42

回答

2

你想設置範圍的方式是有點怪異,並沒有真正考慮的JavaScript是設計用來處理這種方式的優點...

更標準的做法是這樣的:

function($, window, undefined) { 
    var x = 1; 

    function myFunction() { 
     var y = 2; 
     $('.myClass').each(function() { 
      var z = 3; 
     }); 
    } 
}(jQuery, window); 

當然它似乎要重複使用相同的變量名...最外x 中,你可以給它一個名稱空間,如myPlugin.x,但試圖設置一個局部作用域爲 傳遞給each的函數對我來說沒有多大意義...爲了使它影響 本身以外的任何東西,它將不得不使用變量範圍爲myFunction

+0

爲了增加這一點,'var'與Phillip使用它的目的'本地'基本相同。當你說var x時,你保證x將在本範圍內。 – lmortenson 2013-02-24 20:02:18

+0

是的,這是真的......只要你沒有任何需要訪問外部'x',你就可以很好地在'myFunction'中使用'var x = 2;''。 – 2013-02-24 20:05:07

+0

好的,假設我想在上面提到的三個變量的每一箇中保留一個'this'對象的副本。在我的情況下,我會有Variables.this和local.this。但是我不知道我會在每個迭代器中調用它。 – 2013-02-24 20:47:18

2

我建議依靠語義。即每個(甚至是匿名)功能都有其目標。

另外,它還提供了兩個好處:1)更好的可讀性,2)自我證明的代碼(我的意思是,如果你沒有困難給範圍賦予一個有意義的名字,這意味着你的模型是好的,你根據Single Responsibility Principle設計)。

希望這會有所幫助。