JavaScript闭包与全局变量

JavaScript闭包与全局变量,javascript,Javascript,哪一种是最佳实践,哪一种会带来更好的性能 更新:jsperf.com报告(a)更快@ a) 使用闭包 var obj = { init: function() { var self = this; $('#element').click(function() { self.clickEvent(); }); }, clickEvent: function() { this.miscMe

哪一种是最佳实践,哪一种会带来更好的性能

更新:jsperf.com报告(a)更快@

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() {}
};
两者的性能应该(几乎)相同


最佳实践是避免全局性。

在大多数浏览器中,没有明显的性能差异;然而,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={}
的东西!