Javascript全局上下文的变量对象与函数激活对象

时间:2011-06-17 07:29:40

标签: javascript function closures

以下是两个js代码示例:

:一种。函数_foo在全局上下文中定义

  function _foo(){ //some code here
  }

  //... some unrelated code here

  var foo = function(){
    var result = _foo();
    return result;
  }

B中。函数_foo在函数上下文中定义

var foo = function(){
  function _foo(){ //some code here 
  }

  var result = _foo();
  return result;
};

在内存管理方面,哪一个是更好的编程实践?由于函数foo将在应用程序中多次调用,因此最好将_foo保留在(应用程序的)全局上下文中,而不是每次都在函数上下文中创建它foo叫做?或者由于_foo将(大部分)在foo内使用,因此将其作为激活对象的一部分是有意义的吗?

3 个答案:

答案 0 :(得分:4)

C:缓存

var foo = (function(){
  function _foo(){ //some code here 
  }
  return function() {
    var result = _foo();
    return result;
  }
}());

立即执行Foo,函数_foo仅声明一次。

在现代浏览器中,这比“全局”功能慢5%。

相关Benchmark

答案 1 :(得分:1)

要直接回答您的问题,如果您每次要调用它时都必须实例化foo的对象,那么在全局范围内声明它肯定会是一个更快的替代方案。

然而,在JavaScript中,几乎可以肯定从性能角度来看更快,尤其是与DOM交互有关。

在这些例子中,我建议你坚持使用最好的编程习惯。如果这是C#,Java或其他更强类型的语言,你会怎么做?好吧,你将无法声明一个全局函数,所以你可以将它作为静态方法或公共方法放在一个类中:

var foo = function(){};

//static method
foo._foo = function(){
    alert("_foo");
};

//public method
foo.prototype._foo2 = function(){
    alert("_foo2");
};

//calling static method
foo._foo();

//instantiating and calling public method:
var f = new foo();
f._foo2();

//note: this won't work (as we would expect!)
foo._foo2();

这样的大多数事情都是一种权衡,在这里有利于风格和结构,而不是性能是一个很好的。

答案 2 :(得分:0)

尝试在全局上下文中创建函数,并使用闭包函数作为特定于原始功能请求的异步回调。使用过多的匿名函数调用可能会导致令人讨厌的内存泄漏,因为javascript将保留在闭包中使用的顶级变量。

如果您尝试为私有成员设计OO样式,您可能还想使用闭包功能。对“面向对象的javascript”进行一些Google / Stackoverflow搜索,并获得有关该特定主题的更多设计帮助。

来自MDN的报价:

https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope

  

闭包可能耗尽大量内存。只有当返回的内部不再可访问时,才能释放内存...   由于这种低效率,尽可能避免闭包,即尽可能避免嵌套功能。

同样,考虑到OO设计是好的......将你的函数包装到一个对象中,这样你就可以静态地或者通过对象引用来调用它们也是一个很好的设计。