Javascript构造函数和参数

时间:2017-01-26 13:48:13

标签: javascript constructor arguments

这是我的第一个问题,如果我错过任何事情,请道歉。 或许可以找到我的问题的解决方案,但我不知道如何搜索它,没有关于如何在谷歌或其他东西中询问它的线索。

我有以下问题,让我们有这样的构造函数

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;
};

2 个答案:

答案 0 :(得分:0)

这不是魔术:)这种行为的发生是因为:

  

你正在返回一个有两个方法的对象   closures

当在另一个函数中定义一个函数,然后在某个地方存储对它的引用(在这种情况下,当你返回然后附加到self变量)时,就会创建一个closure

简而言之,函数可以访问在其定义块内部及其封闭环境(构造函数定义)中创建的变量。

因此,在调用父级时,它将可以访问封闭范围内的任何变量。

这包括封闭Product函数的任何参数,即您定义的color参数。

所以:

  • 您调用以颜色传递的Product并将其存储在变量a中。此时,a将包含对对象的引用,该对象的属性包括两个方法getColorsetColor

  • 由于后一种方法是闭包,因此它们可以在Product(它们的封闭函数环境被调用)时访问它们的封闭范围。由于使用颜色调用了Product,因此将创建一个名为color的本地变量,但也可用到任何闭包的变量,并为其分配传入的值。在这种情况下color将等于'黄色

  • 由于两种方法都是在同一范围内同时定义的,因此它们都可以访问此变量,从而产生您所经历的结果。

答案 1 :(得分:0)

  

必须以某种方式宣布。我不知道色域在哪里,我无法在物体或原型中找到它,实际上无处可寻。你能解释一下为什么吗?它在哪里?

使用它作为参数名称声明的变量。该参数变量的范围限定为Product函数,即可以在其中的任何位置使用。这就是为什么你得到一个已经宣布的""如果您尝试使用let color,则会出错。

您的方法可以访问(读/写)此局部变量,因为它们是closures