Javascript getter 和 setter - 递归问题

Javascript getters and setters - recursion issue

谁能帮我理解 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: Maximum call stack size exceeded."

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

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

alert(me.name);

</script>

有人可以向我解释一下“_”在这种情况下的作用吗?

很简单。在您的第二个示例中,get 调用自身。

由于您引用 属性 me.name,JavaScript 需要 get 即 属性。发生这种情况时,将触发 getter。使用您的第二个示例,JavaScript 调用 getter,但是 getter 然后被告知做完全相同的事情:获取它要处理的 属性。该函数始终调用自身,使其无限递归。

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

同样的想法也适用于 setter。

它是用于标识私有变量或属性的命名约定。 _对JS没有特别的意义。

来自爱彼迎 JavaScript style guide:

Use a leading underscore _ when naming private properties.

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