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了。所以会报错。
可以用this来解决这个问题。可是不明白为什么属性名必须要一样呢?
还有这个对象的属性作为另一个对象的属性,在实际的执行栈中是怎么存放的呢?是这样吗?
ninja
已经被修改为{}
了,所以chirp()
方法中的ninja.chirp()
调用会抛异常。但这里如果改成this.chirp()
调用就不会有问题。因为虽然ninja
引用的对象变了导致不能直接通过ninja
引用到原来的对象,但是原来的对象仍然存在,在chirp()
中通过this
仍然能引用到(当然这取决于调用.chirp()
的方式,是作为方法调用还是作为普通函数调用,详情参考JavaScript 的 this 指向问题深度解析)。