繁体   English   中英

JavaScript闭包与全局变量

[英]JavaScript closure vs. global variable

哪种最佳实践可以带来更好的性能?

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

两者应(几乎)执行相同的操作。

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

您的关闭代码的问题是,它不能在所有情况下都起作用。 如果您这样做:

obj.clickEvent()

这样就可以了 但是,如果您这样做:

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

则不会,因为this不会在该函数调用上引用obj 但是,如果您只是立即将obj传递给没有以奇怪的方式使用它的东西,那么您就不会有问题,所以它是“干净的” ...但是我仍然认为犯错误太容易了,因此,我建议使用全局变量方法。

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

JavaScript闭包-MDC

在大多数浏览器中,性能没有显着差异。 但是,使用this ,Chrome似乎会出现75%的速度下降 (如果我输入错误,请更正我的快速性能测试)。 可能是主要的最佳做法的问题是,它有时是不清楚哪个对象this指的是。

至于声明(或使用而不声明) 自己的全局变量,如果我们使用过多全局变量,我们将其称为“全局命名空间”。 这可能导致JavaScript代码的不同部分相互干扰,避免使用闭包或“命名空间”进行良好的封装。 最佳做法是仅使用一个或两个全局变量。 例如,jQuery仅使用两个: jQuery$ (如果与另一个库冲突,则可以关闭后者)。

1)由于全局变量很危险,请考虑将全局变量名称放在所有大写形式中 ,以使任何正在阅读代码的人(包括您)都可以看到它们。

2)您的第一个代码段无效。

function obj = {
     // your object stuff
}

应该

var obj = {
    // your object stuff
}

另外,这实际上不是关闭。 这是在Java中实现单例的方式。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM