JavaScript Closures使用全局设置对象或将其传递给每个函数

时间:2011-09-27 09:34:59

标签: javascript closures global-variables parameter-passing

关于javascricpt关闭的另一个问题。我有一个全局的“设置对象”。是否可以在全局范围内的函数中使用它,或者每次函数需要访问对象时传递对象?

为了更好地理解情况的一些小模型here

请忽略“baz()”还从闭包内的全局范围获取“foobar()”中的传递对象。你看,两个版本都运行良好。

问题是我正在传递函数需要处理的任何对象以及每个函数和每次(不必要的开销?),这可能是好的并且易于阅读/理解但我正在认真考虑改变它。缺点是我必须将“这个”范围保持在哪里更深?

感谢您的建议!

2 个答案:

答案 0 :(得分:3)

您的设置对象不是全局,它是在闭包中定义的。

由于意图是闭包中的其他函数访问它,我会说你只是直接访问该对象而不是作为参数传递它是100%。

FWIW,即使您确实将其作为参数传递,开销也可以忽略不计,因为只传递了对象的引用,而不是整个对象的副本。

答案 1 :(得分:1)

所以你基本上有三个选择:

  • 您希望将设置公开为全局变量,并通过您的函数访问它,
  • 您希望将设置隐藏为实现细节,并通过您的函数访问它,
  • 您希望能够为不同的功能提供不同的设置对象。

全局变量方法

嗯,我猜这有点像任何全局变量。如果设置是一个单例(例如它描述了你的应用程序),你看不到有可能用不同的设置对象调用相同的函数,那么我不明白为什么它不能是一个全局变量

也就是说,由于所有的命名冲突,在Javascript中“命名”所有全局变量是件好事。因此,您应该使用一个全局变量foo而不是全局变量barMyGlobalNamespace,这是一个具有属性MyGlobalNamespace.fooMyGlobalNamespace.bar的对象。

私人变量方法

通过闭包访问私有变量是隐藏实现细节的好模式。如果设置对象是您不希望作为API公开的东西,那么这可能是正确的选择。

附加功能参数方法

基本上,如果你看到有可能为不同的函数调用提供不同的设置。或者也许你可以在未来想象这样的收获。如果您的应用程序中有许多设置实例,那么这是明显的选择。

修改

关于评论中的问题:

示例1)

var blah = 123;

function fizbuzz() {
    console.log(blah); // <-- This is an example of a closure accessing 
                       // a variable
    console.log(this.blah); // <-- Most likely makes no sense. It might work, 
                            // because by default this will be set to a global 
                            // object named window, but this is probably not 
                            // what you want. In other situations this might 
                            // point to another object.
}

示例2)

var obj = {

    blah: 123,

    fizbuzz: function() {
        console.log(this.blah); // <-- This is *NOT* an example of a closure
                                // accessing a private variable. It's rather the
                                // closest Javascript can get to accessing an
                                // instance variable by a method, though this 
                                // terminology shouldn't be used.
        console.log(blah); // <-- This MAKES NO SENSE, there is no variable blah 
                           // accessible from here.
    }
};

简而言之,我鼓励您阅读一些关于Javascript基本概念的好书。它有其特殊性,了解它们很好。