【问题标题】:Is this a javascript closure?这是一个 javascript 闭包吗?
【发布时间】:2012-03-22 20:19:10
【问题描述】:
我有这个....
function MyFunction() {
var myVar = "I think I am encapsulated";
this.getMyVar = function() {
return myVar;
}
}
var myProperty = new MyFunction();
console.log(myProperty.getMyVar());
myProperty.myVar = "you're not encapsulated";
console.log(myProperty.getMyVar());
它输出:“我想我被封装了两次”。为什么?我不认为这是一个关闭...
【问题讨论】:
标签:
javascript
function
closures
【解决方案1】:
闭包围绕“getMyVar”函数。构造函数内部的变量“myVar”是一个局部变量,除了“getMyVar”的返回值之外,不在函数外部可见。
在对象上设置“myVar”属性就是这样做的,但“getMyVar”函数不会返回对象的属性;它返回闭包中局部变量的值。
【解决方案2】:
是的。
当您在另一个函数内部定义一个函数时,内部函数可以访问外部函数的所有局部变量...
在您的情况下,getMyVar 可以通过闭包访问myVar。
【解决方案3】:
var myVar = "I think I am encapsulated";
this.getMyVar = function() {
return myVar;
}
这是一个闭包,将返回从函数创建时开始的myVar变量。注意它是一个局部变量,所以在这个函数退出后没有其他方法可以访问它。
var myVar = "I think I am encapsulated";
请注意,这不是this.myVar(您稍后使用myProperty.myVar 设置的变量)。
您可能想要做的是:
function MyFunction() {
this.myVar = "I think I am encapsulated";
this.getMyVar = function() {
return this.myVar;
}
}