JavaScript getter 和 setter - 递归问题

问题描述 投票:0回答:2

JavaScript 的 setter 和 getter 中“_”字符有何意义?

例如,我有以下代码,可以正常工作。

var user = {
    get name() {
        return this._name;
    },
    set name(value) {
        this._name = value;
    }
};

var me = user;
me.name = "Rob";

alert(me.name);

但是,如果我删除下划线,那么我的代码将如下所示,那么我的代码将无法工作,并且我会在浏览器控制台中收到一条错误消息,指出“RangeError:超出了最大调用堆栈大小。”

var user = {
    get name() {
        return this.name;
    },
    set name(value) {
        this.name = value;
    }
};

var me = user;
me.name = "Rob";

alert(me.name);

</script>

在这种情况下“_”会做什么?

javascript recursion getter-setter
2个回答
13
投票

这很简单。在第二个示例中,

get
会调用自身。

由于您引用了属性

me.name
,JavaScript 需要
get
该属性。当这种情况发生时,吸气剂就会被触发。使用第二个示例,JavaScript 调用 getter,但随后 getter 被告知执行完全相同的操作:获取它要处理的属性。该函数总是调用自身,使其无限递归。

但是,在第一个示例中,在 getter 中检索的属性与最初触发 getter 的属性不同。 getter 检索的值在某种程度上是一个存储组件,以避免上述递归问题。尽管名称相似,但这两个属性之间没有实际联系。

同样的想法也适用于 setter。


5
投票

它是用于标识私有变量或属性的命名约定。

_
对于 JS 来说没有特殊意义。

来自 Airbnb JavaScript 风格指南

命名私有属性时使用前导下划线 _。

https://github.com/airbnb/javascript#22.4

© www.soinside.com 2019 - 2024. All rights reserved.