考虑一下这段代码,
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中,范围不是由块确定的(与Java中一样),而是function scoped。
因此,_name
函数中的setName
与_name
中声明的getPerson
相同。