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

Javascript global context’s variable object vs function activation object

本文关键字:对象 激活 函数 变量 全局 上下文 Javascript      更新时间:2023-09-26

以下是js代码的两个示例:

A。函数_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内部使用,因此将其保留为激活对象的一部分是有意义的?

C:缓存

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

Foo被立即执行,并且函数_foo只被声明一次。

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

相关基准

要直接回答您的问题,如果每次要调用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();

大多数这样的事情都是一种权衡,在这里偏爱风格和结构而不是性能是一个好的选择。

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

如果您试图以OO风格为私有成员进行设计,您可能还希望使用闭包函数。在"面向对象的javascript"上进行一些Google/Stackoverflow搜索,可以获得更多关于该特定主题的设计帮助。

MDN报价:

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

闭包会占用大量内存。只有当返回的内存不再可访问时,才能释放内存。。。由于这种低效性,请尽可能避免闭包,即尽可能避免嵌套函数。

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