代码之家  ›  专栏  ›  技术社区  ›  Matty F

JavaScript闭包与全局变量

  •  7
  • Matty F  · 技术社区  · 15 年前

    哪一个是最佳实践,哪一个能带来更好的性能?

    更新: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 回复  |  直到 15 年前
        1
  •  4
  •   SLaks    15 年前

    两者的表现应该(几乎)相同。

    最好的做法是避免全球化。

        2
  •  1
  •   subhaze    15 年前
        3
  •  1
  •   Claudiu    15 年前

    闭包代码的问题是它在所有情况下都不起作用。如果你这样做了:

    obj.clickEvent()
    

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

    那就不会了,因为 this 不会提及 obj 目标

        4
  •  0
  •   PleaseStand    15 年前

    在大多数浏览器中,没有显著的性能差异;然而,Chrome似乎受到了 75% slowdown 使用 this 指。

    拥有 全局变量,如果使用过多,我们称之为全局名称空间“污染”。这可能导致JavaScript代码的不同部分相互干扰,而使用闭包或“命名空间”进行良好的封装可以避免这种情况。最佳实践是最多只使用一个或两个全局变量。例如,jQuery只使用两个: jQuery $ (如果与另一个库冲突,则可以关闭后者)。

        5
  •  0
  •   JustcallmeDrago Vivek    15 年前

    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
    

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