为什么一个var在构造函数中就像两个独立的变量一样?

时间:2017-04-25 18:06:19

标签: javascript variables constructor

我知道foo是一个本地var,this.foo是' this'的属性。我很好奇是什么导致这种行为的潜在机制。看起来JS正在从foo创建一个新的this.foo?:

function Life(){
  var foo = 0;

  function setFoo(newFoo){ foo = newFoo; }

  function getFoo(){ return foo; }

  function setFooThis(newFoo){ this.foo = newFoo; }

  function getFooThis(){ return this.foo; }

  return { setFoo, setFooThis, getFoo, getFooThis }
}

var organism = new Life();
organism.setFoo(23);
organism.setFooThis(45);
console.log(organism.getFoo()); // 23
console.log(organism.getFooThis()); // 45

3 个答案:

答案 0 :(得分:1)

  

我很好奇是什么导致这种行为的潜在机制。

他们只是两件事。一个是范围的一部分,是对象的另一部分。

  

看起来JS正在从foo创建一个新的this.foo?

没有。您明确创建了两个不同的内容,一个使用.setFoo(23),另一个使用.setFooThis(45)

答案 1 :(得分:0)

organism.getFoo()返回闭包值 organism.getFooThis()返回实例值。

答案 2 :(得分:0)

详细说明Knitesh的答案:

您的setFooThis使用this,它引用了Life函数。 foo中的var foo = 0变量是一个范围为函数的变量,但未设置在函数上。这意味着它不能在函数外部访问,但它仍然不是函数的一部分。

您可以通过在Life函数function printThis(){ return this }console.log内创建一个函数来查看此操作。你会看到

的内容

Object { foo: 45, setFoo: function, setFooThis: function, getFoo: function, getFooThis: function }

如果您想详细了解this关键字,建议您查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this#Function_context