2013-02-24 116 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设计)。

希望这会有所帮助。