照着书上的Demo写访问器属性函数时,突然发现一个问题,看下面的Demo
var book={ year:2004, edition:1 }; Object.defineProperty(book,"year",{ get:function(){ return this.year; }, set:function(newValue){ if(newValue>2004){ this.year=newValue; this.edition+=newValue-2004; } } }); book.year=2005; alert(book.edition);
![]()
在Apache中一运行,结果浏览器报出 堆栈溢出的错误;为什么会出现这种情况呢?主要是因为进入了一种死循环状态,以year属性为例:year属性的set访问器代码中有一句为 this.year=newValue; 而this.year又会再次调用set访问器,而set访问器又会执行this.year=newValue,直到内存溢出;
所以Demo应改为:
var book={ year:2004, edition:1 }; Object.defineProperty(book,"year",{ get:function(){ return year; }, set:function(newValue){ if(newValue>2004){ year=newValue; this.edition+=newValue-2004; } } }); book.year=2005; alert(book.edition);
这样就使问题解决了;
(第一次写blog,内容不是很明显,结构不是很清晰,还请各位大神指点,谢谢)
解决javascript 设置访问器属性时的堆栈溢出问题
最新推荐文章于 2024-04-09 09:05:31 发布