对象属性赋值问题

var ninja={
 chirp:function(n){
    return n>1?ninja.chirp(n-1)+"-chirp":"chirp";
}
}
var s={chirp:ninja.chirp};
ninja={};
s.chirp(3);

上面这段代码会出错,因为ninja={};把对象清空了,找不到ninja.chirp了。所以会报错。

clipboard.png

可以用this来解决这个问题。可是不明白为什么属性名必须要一样呢?

clipboard.png

还有这个对象的属性作为另一个对象的属性,在实际的执行栈中是怎么存放的呢?是这样吗?图片描述

阅读 3.4k
4 个回答

ninja 已经被修改为 {} 了,所以 chirp() 方法中的 ninja.chirp() 调用会抛异常。但这里如果改成 this.chirp() 调用就不会有问题。因为虽然 ninja 引用的对象变了导致不能直接通过 ninja 引用到原来的对象,但是原来的对象仍然存在,在 chirp() 中通过 this 仍然能引用到(当然这取决于调用 .chirp() 的方式,是作为方法调用还是作为普通函数调用,详情参考JavaScript 的 this 指向问题深度解析)。

简单回答下吧,其实就是地址引用的。你要知道值引用和地址引用。

按照你var s = {bre: ninja.chirp}
这样定义来执行s(3)
第一步的n=3会执行
但是递归进行n=2的时候this.chirp的this是你定义的s
此时s只有bre方法并没有chirp方法

clipboard.png

属性名必须一样是因为通过s.bre(3)调用时this指向了s,s有bre这个属性,没有chirp属性

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题