我应该在匿名JavaScript函数中封装功能块吗?

我的直觉是,在这样的匿名函数封装代码块是个好主意:
(function() {
  var aVar;
  aVar.func = function() { alert('ronk'); };
  aVar.mem = 5;
})();

因为我不会再需要aVar,所以我假设垃圾收集器会在超出范围时删除aVar.这是正确的吗?或者解释者是否足够聪明,看到我不再使用变量并立即清理它?风格或可读性是否有任何原因我不应该以这种方式使用匿名函数

另外,如果我命名该函数,如下所示:

var operations = function() {
  var aVar;
  aVar.func = function() { alert('ronk'); };
  aVar.mem = 5;
};
operations();

那么操作是否必然会一直存在,直到它超出范围?或者,口译员能否立即告知何时不再需要它?

一个更好的例子

我还想澄清一点,我不一定在谈论全球范围.考虑一个看起来像的块

(function() {

  var date = new Date(); // I want to keep this around indefinitely

  // And even thought date is private,it will be accessible via this HTML node
  // to other scripts.
  document.getElementById('someNode').date = date;

  // This function is private
  function someFunction() {
    var someFuncmember;
  }

  // I can still call this because I named it. someFunction remains available.
  // It has a someFuncmember that is instantiated whenever someFunction is
  // called,but then goes out of scope and is deleted. 
  someFunction();

  // This function is anonymous,and its members should go out of scope and be
  // deleted
  (function() {
    var member;
  })(); // member is immediately deleted
  // ...and the function is also deleted,right? Because I never assigned it to a
  // variable. So for performance,this is preferrable to the someFunction
  // example as long as I don't need to call the code again.

})();

我的假设和结论是否正确?每当我不打算重用一个块时,我不应该只将它封装在一个函数中,而是将它封装在一个匿名函数中,这样该函数就没有引用,并在被调用后被删除,对吧?

解决方法

你是对的,将变量放在匿名函数中是一种很好的做法,可以避免使全局对象混乱.

回答后两个问题:解释器完全不可能知道只要有一个全局可见的引用,对象就不会再被使用.对于所有解释器都知道,你可以随时评估一些依赖于window [‘aVar’]或window [‘operation’]的代码.

基本上,请记住两件事:

>只要一个物体在周围,没有你的说法,它的任何一个插槽都不会神奇地被释放.
>在全局上下文中声明的变量是全局对象的槽(客户端Javascript中的窗口).

结合起来,这意味着全局变量中的对象会持续脚本的生命周期(除非重新分配变量).这就是我们声明匿名函数的原因 – 变量获得一个新的上下文对象,一旦函数完成执行就会消失.除了效率获胜之外,它还减少了名称冲突的可能性.

然而,你的第二个例子(使用内部匿名函数)可能有点过于热心.我不担心“帮助垃圾收集器” – GC可能不会在中间运行,无论如何.担心会持续存在的事情,而不仅仅是比其他情况稍长的事情.这些自执行的匿名函数基本上是代码模块,它们自然地属于一起,所以一个好的指南是考虑是否描述了你正在做的事情.

但是,有理由在匿名函数中使用匿名函数.例如,在这种情况下:

(function () {
  var bfa = new Array(24 * 1024*1024);
  var calculation = calculationFor(bfa);
  $('.resultShowButton').click( function () {
    var text = "Result is " + eval(calculation);
    alert(text);
  } );
})();

这导致巨大的数组被点击回调捕获,因此它永远不会消失.您可以通过将数组隔离在自己的函数中来避免这种情况.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...