当我将 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。
我对 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
.
简而言之,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。