Javascript getters and setters - recursion issue

Javascript getters and setters - recursion issue

本文关键字:recursion issue setters getters and Javascript      更新时间:2023-09-26

有人可以帮我理解'_'字符在javascript的setters和getters中的重要性吗? 例如,我有以下代码可以正常工作。

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>

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

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

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

但是,在

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

同样的想法也适用于二传手。

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

来自Airbnb JavaScript 风格指南:

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

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