JavaScript闭包使用全局设置对象或将其传递给每个函数
JavaScript Closures use global setting object or pass it to each function
关于javascript闭包的另一个问题。我有一个全局的"设置对象"。是更好地使用它从全局作用域内的函数或传递对象每次函数需要访问对象?
为了更好地理解这里的情况的一个小模型
请忽略"baz()"也从闭包内的全局作用域获取"foobar()"内传递的对象。您可以看到两个版本都运行良好。
事情是,我传递任何对象的函数需要工作的每个函数和每次(不必要的开销?),这可能是很好,容易阅读/理解,但我正在认真考虑改变这一点。缺点是我必须保留"this"范围,无论它在哪里深入,对吗?
谢谢你的建议!
你的settings对象不是全局的,它是在闭包中定义的。
由于目的是让闭包内的其他函数访问它,所以我认为直接访问该对象而不将其作为参数传递是100%可以的。
你基本上有三个选择:
- 你想把设置作为一个全局变量,并让它被你的函数访问,
- 你想隐藏设置作为一个实现细节,让它被你的函数访问,
- 你想要提供给不同功能提供不同设置对象的可能性。
全局变量方法
嗯,我想这有点像任何全局变量。如果设置是一个单例(例如,它描述了你的应用程序),你不能看到任何好处,有可能调用相同的函数与不同的设置对象,那么我不明白为什么它不能是一个全局变量。
也就是说,由于所有的命名冲突,在Javascript中最好"命名空间"所有的全局变量。所以代替全局变量foo
和bar
,你应该有一个全局变量MyGlobalNamespace
,它是一个具有属性的对象:MyGlobalNamespace.foo
和MyGlobalNamespace.bar
。
私有变量方法
通过闭包访问私有变量是隐藏实现细节的好模式。如果您不想将settings对象公开为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基本概念的好书。它有它的特点,知道它们是很好的。
- 构造函数函数闭包变量
- var 函数名称与函数闭包中的名称分配
- 函数闭包
- 何时使用自包含函数(闭包),何时不使用自包含函数
- 避免在 JavaScript 中使用函数闭包
- 难以理解Javascript嵌套函数/闭包
- 在 Javascript 中优化函数闭包的使用有多大价值
- 调用超级构造函数(闭包编译器和库)
- 如何从浏览器控制台访问存储在函数闭包中的 javascript 变量
- 如何在 javascript 中访问父函数闭包
- 函数闭包中的另一个jQuery版本
- jquery对象文字函数/闭包-缺少一些明显的东西
- 这两个使用父类的函数闭包有什么区别吗?
- JavaScript自调用函数闭包不能正常工作
- 改变“;var”;在创建新实例的构造函数闭包内部
- 函数闭包显示外部函数的变量
- 如何使用jsdoc-toolkit记录匿名函数(闭包)
- .prototype不允许在函数闭包中使用
- 自调用匿名函数闭包内变量的生命周期
- 多个文件上的相同函数闭包