为什么我可以访问该类课外的变量

时间:2017-05-05 21:04:49

标签: javascript


我试图理解为什么我可以从我的班级formOptions访问该对象formValidate

我的意思是,我仍然可以像Python语言一样思考,但在我看来,这不应该具有访问权限,因为我们需要为formOptions对象提供类构造函数。

const formOptions = {
  defaultValue: "Write:",
  colorFocus: "red",
  errorSize: 15
};

class formValidate {
  constructor(form) {
    this.form = form;
    console.log(formOptions);
  }
}

你能解释一下课程的工作范围吗?

1 个答案:

答案 0 :(得分:0)

formOptionsformValidate共享相同的外部范围。在JavaScript中,传统是词汇范围(功能范围),我们可以说它们与范围链处于同一级别。

ES6确实引入了块范围,尤其是constlet。但显然,你没有得到它...... const没有创建一个本地范围。它只存在于已定义的块范围内。如果你想要隔离你的formOptions,你可以使用旧的技巧并将你的常量封装在一个函数中:



function foo() {
  const formOptions = {
    defaultValue: "Write:",
    colorFocus: "red",
    errorSize: 15
  };
}

class FormValidate {
  constructor(form) {
    this.form = form;

    // ReferenceError
    console.log(formOptions);
  }
}

let fv = new FormValidate();




但是因为const是块作用域,所以它也适用于任何块。以下是一些例子:



{
  const formOptions = {
    defaultValue: "Write:",
    colorFocus: "red",
    errorSize: 15
  };
}

class FormValidate {
  constructor(form) {
    this.form = form;

    // ReferenceError
    console.log(formOptions);
  }
}

let fv = new FormValidate();






if (true) {
  const formOptions = {
    defaultValue: "Write:",
    colorFocus: "red",
    errorSize: 15
  };
}

class FormValidate {
  constructor(form) {
    this.form = form;

    // ReferenceError
    console.log(formOptions);
  }
}

let fv = new FormValidate();






for (let i = 0; i < 3; i++) {
  const formOptions = {
    defaultValue: "Write:",
    colorFocus: "red",
    errorSize: 15
  };
}

class FormValidate {
  constructor(form) {
    this.form = form;

    // ReferenceError
    console.log(formOptions);
  }
}

let fv = new FormValidate();
&#13;
&#13;
&#13;