Javascript getters和setter - 递归问题

时间:2015-06-12 18:31:16

标签: 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);

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

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

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

alert(me.name);

</script>

有人可以向我解释一下&#34; _&#34;在这种情况下呢?

2 个答案:

答案 0 :(得分:7)

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

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

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

同样的想法适用于setter。

答案 1 :(得分:3)

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

来自Airbnb JavaScript style guide

  

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

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