如果我们有像下面那样的工厂功能。为什么内部变量bark
是私有的?
var dog = function(){
var bark = "Woof" //What makes this private?
return {
talk: function(){
console.log(bark)
}
}
}
var fido = dog()
fido.bark = "BARK BARK" //Why does this not change the bark inside the function?
fido.talk()
答案 0 :(得分:2)
由于返回的对象没有该属性,因此无法访问工厂函数返回的对象的bark属性。让我解释一下。
考虑工厂功能的这个小变化。我已将该退货声明分解为两个陈述。
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
现在,仔细查看return语句之前的var dog = function(){
var bark = "Woof";
var returnObject = {
talk: function(){
console.log(bark)
}
};
return returnObject;
}
变量。它没有returnObject
属性。只是一个谈话方法。请记住,这是最后返回的对象,因此在此返回的对象上访问或编辑bark属性不会对内部树皮值产生影响。
您可能想知道bark
方法如何访问内部树皮变量。由于JavaScript中称为“闭包”的概念,talk
方法可以访问内部talk
变量。你应该阅读更多内容。在stackoverflow上,关于闭包的优秀资源是this answer。
答案 1 :(得分:1)
这里的关键思想是当函数引用外部作用域中的变量时 - 例如在这种情况下,talk
函数引用来自外部作用域的bark
变量 - &# 39; s称为封闭。
变量由函数本身保存,并且通过语言设计,不能由外部世界直接访问&#34;。如果您选择公开它,它只能被外界访问,例如作为函数返回值的一部分。
如果您想要一个可以更改bark
的版本,则必须执行以下操作:
var dog = function(){
var theDog = {
bark: "bark",
talk: function() {
console.log(this.bark);
}
};
return theDog;
}
var fido = dog()
fido.bark = "BARK BARK" //Why does this not change the bark inside the function?
fido.talk()
(一个更惯用的版本可能会使用Dog
构造函数,但我试图尽可能接近原始代码)
MDN article on closures非常适合关于闭包的更多信息。
答案 2 :(得分:0)
函数中可用的变量bark.to使其公开,有必要将其分配给它。
var dog = function(){
this.bark = "Woof"
return {
talk: function(){
console.log(this.bark)
}
}
}
var fido = dog()
fido.bark = "BARK BARK"
fido.talk()
或通过构造函数传输他的数据
var dog = function(data){
if(!data) data = 'Woof';
var bark = data;
......
......