对象方法比全局函数更快吗?

时间:2012-10-25 08:04:31

标签: javascript jquery oop optimization

问题

无法相信我在网上找不到任何东西,也许我正在寻找错误的东西......

可能几乎没有差异,但是当我尽可能地优化我的代码时,我觉得值得一提。

很简单,我想知道在对象中定义和运行方法是否比在全局定义和运行函数更快。

实施例

考虑一下:

(function($){  
    $.fn.test = function() {  
        // do something here
    };  
})(jQuery);

而且:

function test(){
    // do something here
}

我的问题

以上哪项更快,为什么?如果速度没有差异,那么你建议使用哪个?

提前致谢

更新1

因为它可能是相关的,我觉得有必要解释我为什么问这个问题。我有一个多年来写的库,里面包含各种各样的函数。由于它们中有这么多,我想知道如果我要扩展jQuery对象它们是否会运行得更快,或者保持它们原样?

3 个答案:

答案 0 :(得分:6)

理论上,您只需要计算必须搜索的对象的数量,以确定哪个更快。变量是针对作用域链解析的,脚本引擎必须首先搜索函数的执行上下文,然后是外部上下文,最后是全局上下文。

属性解析必须首先在作用域链上找到对象,然后找到对象或其[[Prototype]]链上的属性。

但实际上,编译器优化意味着上述简单分析会在正确的情况下出错,并且在不同的浏览器中针对不同的情况提供不同的结果。

通常,此类优化会导致性能发生微小变化,因此不应仅考虑性能原因。设计适合您的应用程序架构,易于维护和逻辑分组的对象和方法。

答案 1 :(得分:3)

我在一年前做过这项研究,我可以说使用this.test()会更快。

但这取决于你需要什么。如果您只想为特定的“小部件”创建一个对象,我建议不要向jQuery添加不必要的函数。

简单的面向对象用法:

function Car(name) {
    this.name = name;
}

Car.prototype.startEngine = function() {
    // Start the engine...
};

Car.prototype.drive = function() {
    this.startEngine();

    // Switch the lights, fasten your seatbelt...
};


// create a new car
var bmw = new Car('BMW');

// Drive the car
bmw.drive();

你需要了解的另一件事是环境(我希望你理解我的意思)。最好为变量和函数创建一个新的空间,因此没有太多的变量/函数可供查找。想象一下,作为一个列表 - 如果它更小,它在其中找到的东西会更快。 所以,你创造了一个新的“空间”:

(function(){
    // Your fresh space.
})();

JavaScript将尝试在“本地”空间中查找内容,然后它将尝试在全局空间中查找内容。想象一下这样:

|- global
     |- function aaa
     |- function bbb
     |- var myName
     |- your local space
           |- function ccc
           |- function aaa  It will not overwrite global function with the same name
           |- var someVariable

正如您所看到的,在“本地空间”中只有3个项目,因此查找内容的速度更快。

在本地“空间”中调用半全局函数会更快。而且,如果你想做一些面向对象的东西,扩展“对象”会更好更快。

<强>更新 如果你想整理你的函数库,那么你可以将它们分组到一个对象中。我觉得它不会慢一些。

var lib = {
    foo: function() {},
    bar: function() {},
    test: function() {}
};

lib.test();

答案 2 :(得分:1)

当您想知道两种方法中的哪一种更快时,最好的方法是对它们进行分析。这将为您提供与您的代码相关的结果,而不是通用概念。

在我看来,您不应该为了速度而优化它,而是为了API的可维护性和丰富性。从你的问题

function test(){
    // do something here
}

在全球范围内总是很糟糕。理想情况下,您应该将这些方法放在命名空间中,并且问题中的示例1将其作为jQuery命名空间的一部分。