这是我的第一个问题,如果我错过任何事情,请道歉。 或许可以找到我的问题的解决方案,但我不知道如何搜索它,没有关于如何在谷歌或其他东西中询问它的线索。
我有以下问题,让我们有这样的构造函数
const Product = function (color) {
let self = {};
self.setColor = function(colorToSet) {
color = colorToSet;
}
self.getColor = function() {
return color;
}
return self;
};
现在当我尝试使用时:
let self = {}, color;
在chrome控制台中我收到颜色已经声明的错误,所以我删除了颜色字段,之后(上面有一个代码片段),魔术发生了,我无法解释。
让我们说我会写这样的东西:
let a = Product("Yello");
a.getColor() ----> "Yellow"
a.setColor("red");
a.getColor() ----> "red";
如果它第一次返回颜色,则必须以某种方式声明它。 我不知道色域在哪里,我无法在物体或原型中找到它,实际上无处可寻。你能解释一下为什么吗?它在哪里?
我知道我可以举例说明颜色: self.color = color; 但我想知道上面的例子是如何工作的以及色域发生了什么。
你能否告诉我是否可以使用let以这种方式从参数中声明值?
const Product = function (color) {
let self = {}, color;
self.setColor = function(colorToSet) {
color = colorToSet;
}
self.getColor = function() {
return color;
}
return self;
};
答案 0 :(得分:0)
这不是魔术:)这种行为的发生是因为:
你正在返回一个有两个方法的对象 closures
当在另一个函数中定义一个函数,然后在某个地方存储对它的引用(在这种情况下,当你返回然后附加到self
变量)时,就会创建一个closure。
简而言之,函数可以访问在其定义块内部及其封闭环境(构造函数定义)中创建的变量。
因此,在调用父级时,它将可以访问封闭范围内的任何变量。
这包括封闭Product函数的任何参数,即您定义的color
参数。
所以:
您调用以颜色传递的Product并将其存储在变量a
中。此时,a将包含对对象的引用,该对象的属性包括两个方法getColor
和setColor
由于后一种方法是闭包,因此它们可以在Product(它们的封闭函数环境被调用)时访问它们的封闭范围。由于使用颜色调用了Product,因此将创建一个名为color
的本地变量,但也可用到任何闭包的变量,并为其分配传入的值。在这种情况下color
将等于'黄色
由于两种方法都是在同一范围内同时定义的,因此它们都可以访问此变量,从而产生您所经历的结果。
答案 1 :(得分:0)
必须以某种方式宣布。我不知道色域在哪里,我无法在物体或原型中找到它,实际上无处可寻。你能解释一下为什么吗?它在哪里?
使用它作为参数名称声明的变量。该参数变量的范围限定为Product
函数,即可以在其中的任何位置使用。这就是为什么你得到一个已经宣布的""如果您尝试使用let color
,则会出错。
您的方法可以访问(读/写)此局部变量,因为它们是closures。