是否带有new的Javascript

Javascript with new or not

本文关键字:Javascript new 是否      更新时间:2023-09-26

我有以下函数

var myInstance =  (function() {
  var privateVar = 'Test';
  function privateMethod () {
    // ...
  }
  return { // public interface
    publicMethod1: function () {
      // all private members are accesible here
        alert(privateVar);
    },
    publicMethod2: function () {
    }
  };
})();

如果我在函数中添加一个新的,有什么区别。从萤火虫看来,似乎两个物体是一样的。据我所知,两者都应该强制执行singleton模式。

var myInstance =  new (function() {
  var privateVar = 'Test';
  function privateMethod () {
    // ...
  }
  return { // public interface
    publicMethod1: function () {
      // all private members are accesible here
        alert(privateVar);
    },
    publicMethod2: function () {
    }
  };
})();

虽然最终结果看起来完全相同,但它是如何到达那里的以及在什么中执行是不同的。

第一个版本执行匿名函数,其中this位于window对象的上下文中。第二个版本执行匿名函数,但this在一个新的空对象的上下文中。

最后,它们都返回了另一个对象(您的Singleton)。这只是执行上下文中的一个细微差异。

要对此进行测试,请在声明privateVar变量之前添加一个alert(this);

@Tom Squires:这不一定是真的,不声明变量是一种糟糕的做法。带有"use strict";指令的脚本确实会导致JS引擎抱怨(假设引擎支持"use strict"