我应该在匿名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();

那么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中的window槽。
  • 综合起来,这意味着全局变量中的对象持续用于脚本的生命周期(除非变量被重新分配)。 这就是我们声明匿名函数的原因 - 变量获取一个新的上下文对象,只要函数完成执行就立即消失。 除了提高效率之外,它还可以减少名称冲突的可能性。

    不过,你的第二个例子(带有内部匿名函数)可能有些过分热情。 我不担心在那里“帮助垃圾收集器” - 无论如何,GC可能不会在中间运行。 担心会持续存在的事情,而不仅仅是稍微长一些。 这些自动执行的匿名函数基本上是自然属于一组的代码模块,因此,一个很好的指导就是考虑是否描述了你正在做的事情。

    不过,有理由在匿名函数中使用匿名函数。 例如,在这种情况下:

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

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


    您添加到全局范围内的任何内容都将保留在页面卸载之前(除非您专门删除它)。

    将属于本地范围或对象的变量和函数放在一起通常是一个好主意,以便尽可能少地添加到全局名称空间中。 这样一来,重用代码就容易多了,因为您可以在页面中组合不同的脚本,并将命名冲突的风险降至最低。

    链接地址: http://www.djcxy.com/p/51493.html

    上一篇: Should I encapsulate blocks of functionality in anonymous JavaScript functions?

    下一篇: Difference between wiring events with and without "new"