Javascript全局上下文’;s变量对象与函数激活对象

Javascript全局上下文’;s变量对象与函数激活对象,javascript,function,closures,Javascript,Function,Closures,下面是两个js代码示例: A.函数\u foo是在全局上下文中定义的 function _foo(){ //some code here } //... some unrelated code here var foo = function(){ var result = _foo(); return result; } var foo = function(){ function _foo(){ //some code here } v

下面是两个js代码示例:

A.函数\u foo是在全局上下文中定义的

  function _foo(){ //some code here
  }

  //... some unrelated code here

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

  var result = _foo();
  return result;
};
B.函数\u foo在函数上下文中定义

  function _foo(){ //some code here
  }

  //... some unrelated code here

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

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

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

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

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

引用MDN:

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


再次强调,考虑到OO设计是好的。。。将函数包装到对象中,以便可以静态调用或通过对象引用调用它们,这也是一个很好的设计。

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

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

C:缓存

var foo = (function(){
  function _foo(){ //some code here 
  }
  return function() {
    var result = _foo();
    return result;
  }
}());
Foo立即执行,函数
\u Foo
只声明一次

在现代浏览器中,这比“全局”函数慢5%


相关的

两个例子都有不同的语义。使用表达所需语义的“最清晰”版本。当性能成为问题时,或者更确切地说,如果性能成为问题,则担心性能。(哦,
\u foo
从来没有在上面的“全局上下文”中定义过——每个函数范围都引入了一个新的执行上下文。)对,“全局上下文”在这里用词不当,因为“\u foo”在匿名函数的范围内。我只是编辑了代码,以免引起混淆。目的是区分我怀疑的案例@fenderplayer这还取决于您的浏览器范围,对于您不关心的FF4和Chrome,对于您关心的IE6中糟糕的JScript引擎的支持。不要在全局范围内创建函数。那太难看了。此外,内存泄漏源于坏引擎和对DOM的循环引用。这取决于浏览器,但您对DOM引用的理解是正确的。在某些情况下,AJAX调用可能会受到闭包引用的影响,因为我自己也遇到过这个讨厌的bug。在全球范围内发挥作用,丑陋?这绝对是主观的。我完全赞成尽量减少污染。它的作用域链越高,查找时间就越长。我同意,这样的东西也更容易调试