Javascript getters和setter - 递归问题

Soh*_*azi 7 javascript recursion getter-setter

有人可以帮助我理解"_"字符在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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

alert(me.name);

</script>
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释在这种情况下"_"的作用是什么吗?

Ano*_*ous 8

这很简单.在你的第二个例子中,get自称.

由于您引用了该属性me.name,因此JavaScript需要get该属性.发生这种情况时,会触发吸气剂.使用你的第二个例子,JavaScript调用getter,然后告诉getter做同样的事情:获取它要处理的属性.该函数始终调用自身,使其无限递归.

但是,在第一个示例中,在getter中检索的属性与最初触发getter的属性不同.由getter重新获取的值在某种程度上是一个存储组件,以避免上面提到的递归问题.这两个属性之间没有实际的连接,即使它们具有相似的名称.

同样的想法适用于setter.

  • 谢谢你的耐心,你很棒.我意识到我犯了一些愚蠢的错误. (2认同)

Ani*_*mah 5

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

来自 Airbnb JavaScript风格指南

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

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