在函数内创建的对象的 Javascript 变量范围

标签 javascript scope javascript-objects

考虑这段代码,

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 函数中的 _namegetPerson 中声明的 _name 相同。

关于在函数内创建的对象的 Javascript 变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35470444/

相关文章:

javascript - 是否有使用 Knockout 绑定(bind)页面进行更改跟踪的标准方法?

javascript - 为什么我不能在自定义对象中引用变量?

javascript - 指令链接函数中的 "Scope"是根作用域,而不是指令作用域

javascript - 如何从 js 中的数组对象中仅获取少量属性

javascript - 什么时候可以在字符串中换行?

javascript - 修改 DOM 元素的属性

C++ 范围问题 : Creating a matrix class without wasting space

Javascript - 在引号和直接写属性名称有什么区别吗?

javascript - Chrome 的 JavaScript 控制台是否懒惰评估对象?

javascript - 仅替换字符串中的数字