JavaScript闭包与全局变量

时间:2010-11-03 02:29:02

标签: javascript

哪种方法最佳,哪种方式有更好的效果?

更新: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() {}
};

5 个答案:

答案 0 :(得分:4)

两者都应该(几乎)相同地执行。

最佳做法是避免使用全局变量。

答案 1 :(得分:1)

关闭代码的问题在于它不会在所有情况下都有效。如果你这样做:

obj.clickEvent()
然后它会起作用。但如果你这样做:

var f = obj.clickEvent;
//hundreds of lines of code
f();

然后它不会,因为this将不会在该函数调用上引用obj。如果你只是立即将obj关闭到一些不以奇怪的方式使用它的东西,那么你就不会有这个问题,所以它更“干净”......但我仍然认为它太容易了犯错误,所以我推荐全局变量方法。

答案 2 :(得分:1)

很高兴在这里写关于闭包的内容。

JavaScript Closures - MDC

答案 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

我正在将我立即执行的函数的结果赋给变量。该函数返回一个对象,因此,我正在为该变量分配一个对象。但该对象也有私人成员和私人职能。