我知道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
答案 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