[英]JavaScript closure vs. global variable
哪种最佳实践可以带来更好的性能?
更新:jsperf.com报告(a)更快@ http://jsperf.com/closure-vs-global-variable
a)使用闭包
var obj = {
init: function() {
var self = this;
$('#element').click(function() {
self.clickEvent();
});
},
clickEvent: function() {
this.miscMethod();
},
miscMethod: function() {}
};
b)使用全局变量
var obj = {
init: function() {
// removed self=this closure
$('#element').click(this.clickEvent); // simple method handler
},
clickEvent: function() {
obj.miscMethod(); // global variable used
},
miscMethod: function() {}
};
两者应(几乎)执行相同的操作。
最佳做法是避免全局变量。
您的关闭代码的问题是,它不能在所有情况下都起作用。 如果您这样做:
obj.clickEvent()
这样就可以了 但是,如果您这样做:
var f = obj.clickEvent;
//hundreds of lines of code
f();
则不会,因为this
不会在该函数调用上引用obj
。 但是,如果您只是立即将obj
传递给没有以奇怪的方式使用它的东西,那么您就不会有问题,所以它是“干净的” ...但是我仍然认为犯错误太容易了,因此,我建议使用全局变量方法。
很高兴在这里写有关闭包的内容。
在大多数浏览器中,性能没有显着差异。 但是,使用this
,Chrome似乎会出现75%的速度下降 (如果我输入错误,请更正我的快速性能测试)。 可能是主要的最佳做法的问题是,它有时是不清楚哪个对象this
指的是。
至于声明(或使用而不声明) 自己的全局变量,如果我们使用过多的全局变量,我们将其称为“全局命名空间”。 这可能导致JavaScript代码的不同部分相互干扰,避免使用闭包或“命名空间”进行良好的封装。 最佳做法是仅使用一个或两个全局变量。 例如,jQuery仅使用两个: jQuery
和$
(如果与另一个库冲突,则可以关闭后者)。
1)由于全局变量很危险,请考虑将全局变量名称放在所有大写形式中 ,以使任何正在阅读代码的人(包括您)都可以看到它们。
2)您的第一个代码段无效。
function obj = {
// your object stuff
}
应该
var obj = {
// your object stuff
}
另外,这实际上不是关闭。 这是在Java中实现单例的方式。
var mySingleton = (function () {
var privateVar = "foo";
function privateFunction() { //this function can only be accessed by other private
//and privaleged functions defined in this closure
// do stuff.
}
//stuff to run immediately that will also have access to private variables/functions
singletonObj = {
key1:"value1",
key2:"value2",
privilgedFunction: function () { // this method is accessible from the outside
// do stuff. you can access private variables in here
}
};
return singletonObj; //return the object that you just created
}()); //immediately execute the function, returning an object with private variables
我将立即执行的函数的结果分配给变量。 该函数返回一个对象,因此,我将一个对象分配给该变量。 但是该对象也具有私有成员和私有功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.