考虑一下这段代码,

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相同。

10-06 06:39