当我将 IIFE 分配给变量时,IIFE 如何工作?

How does IIFE works when I assign an IIFE to a variable?

我对 javascript 中的以下代码感到困惑。

var x=(function(){
  var customObject = function(){};

  customObject.prototype.sayHello=function(){
  alert("hello");
  };

  return customObject;
})();

//var y=new x();// If I uncomment this line and comment the next line "var 
//y=x;" the code works 
var y=x;
y.sayHello();

此代码不会打招呼,但会在我删除评论时打招呼。我读到 IIFE 在定义后立即执行。因此,它应该直接将 customObject 分配给 x。

我的问题是为什么我需要创建一个新的 x 实例来打招呼。我不清楚 IIFE 在这里是如何工作的。

请帮助我理解这个概念。先感谢您 :-) 。

好的,我明白了你的困惑。

首先,IIFE 在这里正确地完成了它的工作。它执行 returns customObject 到变量 x

这是它应该做的。

现在开始回答您的实际问题,为什么我需要创建一个新的 x 实例来打招呼?

您可能已经阅读,所有 classes(functions) 都有一个 prototype,所有 variables 都有 __proto__ 属性。

该构造函数的实例可以访问原型上设置的任何内容。

例如:

var myName = "apl"; // a simple string

console.log(myName.toUpperCase()) // outputs: APL

您认为我们如何能够对我们的变量名称调用 toUpperCase()

我们可以,因为 typeof(myName ) 结果是 string。所以 myName 可以调用 String.prototype.

上设置的任何 properties/methods

简而言之,myName上的__proto__属性应该设置为String的prototype

myName.__proto__ === String.prototype // true 因为 myName 是 String

的一个实例

因此,在您的情况下,您需要 y 成为 x 的实例。只有这样你才能访问 x 原型上设置的方法,而原型又是 customObject.prototype

customObject 分配给 x 是正确的。但是 customObject(因此 x)没有 sayHello 属性。它有一个prototype属性,那个有一个sayHello属性.

当您执行 y=x 然后 y.sayHello() 时,您正在尝试调用 customObject.sayHello,它不存在。

当您执行 y=new x() 时,您创建了一个对象,其原型是 customObject.prototype 对象。然后,当您调用 y.sayHello() 时,通过原型链找到 sayHello 函数。

这与您使用 IIFE 并没有真正的关系。如果你只是写,你会得到相同的结果:

var x = function() {}
x.prototype.sayHello = function() {
  alert("hello");
}

而不是 IIFE。