考虑这段代码,
var getPerson = function() {
var _name = "";
var person = {};
person.getName = function() {
return _name;
}
person.setName = function(value) {
_name = value;
}
return person;
}
p1 = getPerson();
p1.setName("foo");
p2 = getPerson();
p2.setName("bar");
console.log(p1.getName()); // logs "foo"
console.log(p2.getName()); // logs "bar"
有人可以解释一下 _name 的范围吗? p1._name 和 p2._name 不存在。该变量真正存储在哪里?
最佳答案
_name
的作用域为 getPerson
函数,因为它是使用 var
关键字声明的。
嵌套在 getPerson
中的任何函数都将继承 getPerson
中声明的变量,并且它们可以覆盖它以声明自己的变量。 This concept is called closure
在进行任何认真的 JavaScript 开发之前值得理解。
在 JavaScript 中,作用域不是由 block 决定的(如在 Java 中),而是 function scoped .
因此,setName
函数中的 _name
与 getPerson
中声明的 _name
相同。
关于在函数内创建的对象的 Javascript 变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35470444/