哪种方法最佳,哪种方式有更好的效果?
更新: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() {}
};
答案 0 :(得分:4)
两者都应该(几乎)相同地执行。
最佳做法是避免使用全局变量。
答案 1 :(得分:1)
关闭代码的问题在于它不会在所有情况下都有效。如果你这样做:
obj.clickEvent()
然后它会起作用。但如果你这样做:
var f = obj.clickEvent;
//hundreds of lines of code
f();
然后它不会,因为this
将不会在该函数调用上引用obj
。如果你只是立即将obj
关闭到一些不以奇怪的方式使用它的东西,那么你就不会有这个问题,所以它更“干净”......但我仍然认为它太容易了犯错误,所以我推荐全局变量方法。
答案 2 :(得分:1)
很高兴在这里写关于闭包的内容。
答案 3 :(得分:0)
在大多数浏览器中,没有明显的性能差异;但是,Chrome似乎使用this
使用75% slowdown(如果我弄错了,请更正我的快速性能测试)。可能主要的最佳实践问题是,有时可能不清楚this
指的是哪个对象。
至于声明(或使用而不使用声明)你的自己的全局变量,如果我们使用太多的变量,我们称之为全局命名空间“污染”。这可能导致JavaScript代码的不同部分相互干扰,使用闭包或“命名空间”避免使用良好的封装。最佳实践是最多只使用一个或两个全局变量。例如,jQuery仅使用两个:jQuery
和$
(后者可以在与另一个库冲突时关闭)。
答案 4 :(得分:0)
1)由于全局变量是危险的,考虑将全局变量名称放在全部大写中,这样对于正在阅读代码的任何人(包括您)来说,它们都是显而易见的。
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
我正在将我立即执行的函数的结果赋给变量。该函数返回一个对象,因此,我正在为该变量分配一个对象。但该对象也有私人成员和私人职能。