JavaScript闭包与全局变量
哪一种是最佳实践,哪一种会带来更好的性能 更新:jsperf.com报告(a)更快@ a) 使用闭包JavaScript闭包与全局变量,javascript,Javascript,哪一种是最佳实践,哪一种会带来更好的性能 更新:jsperf.com报告(a)更快@ a) 使用闭包 var obj = { init: function() { var self = this; $('#element').click(function() { self.clickEvent(); }); }, clickEvent: function() { this.miscMe
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() {}
};
两者的性能应该(几乎)相同
最佳实践是避免全局性。在大多数浏览器中,没有明显的性能差异;然而,Chrome似乎在使用
这个(如果我弄错了,请纠正我的快速性能测试)。可能主要的最佳实践问题是,有时可能不清楚该
指的是哪个对象
至于声明(或使用而不声明)您自己的全局变量,如果使用太多,我们称之为全局名称空间“污染”。这可能导致JavaScript代码的不同部分相互干扰,使用闭包或“名称空间”进行良好的封装可以避免这种情况。最佳实践是最多只使用一个或两个全局变量。例如,jQuery只使用了两个:<代码> jQuery 和 $< /Cord>(如果与另一个库冲突,则可以关闭它)。 < P > 1,因为全局变量是危险的,请考虑将全局变量名放在<强>所有CAP< <强>中,这样对读取代码的任何人(包括你)都是显而易见的。
2) 您的第一个代码段无效
function obj = {
// your object stuff
}
应该是
var obj = {
// your object stuff
}
另外,这实际上不是一个结束。下面是如何在Javascript中实现单例
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
我将立即执行的函数的结果赋给变量。该函数返回一个对象,因此,我将为该变量指定一个对象。但是该对象也有私有成员和私有函数。闭包代码的问题是它不能在所有情况下都工作。如果您这样做:
obj.clickEvent()
那就行了。但如果你这样做了:
var f = obj.clickEvent;
//hundreds of lines of code
f();
然后它不会,因为此
不会在该函数调用中引用obj
。但是,如果您只是立即将obj传递给不以奇怪方式使用它的对象,那么您就不会有这个问题,因此它“更干净”。。。但是我仍然认为它太容易出错,所以我推荐全局变量方法。关于闭包的文章写得不错
谢谢,你能详细说明一下吗?我认为声明全局变量是最好避免的,我没听说过这也适用于它们在方法中的使用。这是有原因的吗?+1 jQuery提供的DOM方法将大大掩盖您在上述两个版本中可能检测到的任何性能差异。@Hamish a和b都使用jQuery,这不是问题所在。@Slaks我读过,不要用您自己的变量混乱全局对象,但是我从来没有读过,你应该避免使用你已经创建的全局变量。我猜我的意思是——有没有理由认为b)不是最佳实践?干杯。@Matty:他的意思是变量类型之间的性能差异可以忽略不计。请参阅我的答案,以及此链接:它解释了闭包如何工作的更多内容。告诉我(b)更快。关于jsperf.com,这告诉了我们什么?我不知道是谁创建了修订版5,但他们已经切换了(a)和(b)。因此,闭包片段的速度更快。“jsperf.com报告说(a)更快”-对他们有好处。只要他们在每次更新一个JavaScript引擎时重新检查并重新发布结果,并且你记得检查它,那么你就有了坚实的基础。我想根据你的逻辑,我们根本不应该进行任何性能测试。汽车、飞机。。。你知道,如果有什么变化:-/它也不起作用,因为clickEvent()
不返回任何内容。它是一个闭包,不需要单例模式来形成闭包。存储(a)中匿名函数的执行上下文,并可以访问其外部函数变量(self)。。。哦,我以为你的“闭包”是你的函数obj={}
的东西!