var obj = {
hello: function(n) {
return obj.hello(n-1) + n;
}
}
var obj2 = {hello: obj.hello};
obj = {};
console.log(obj2.hello(3));
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这是典型的引用丢失问题,两个对象引用了相同的函数,但函数引用自身的时候只是通过其中的一个对象,当obj置为空对象时,obj2对象的匿名函数仍然存在,但是obj1的属性已经不存在了,而这时再通过原有的obj.hello属性引用进行递归调用自身时,就会出现严重的问题。
解决方案建议将匿名函数的obj1显式引用改成this(函数上下文),这样obj2.hello()的this对象就是obj2,如此便可解决问题。
或者使用内联命名函数,将obj1对象定义如下:
因为你改变了
obj的引用,所以在hello函数里面的引用的obj是那个新的obj。这个新的引用当然没有
hello函数,自然就会报错。但是,必须要注意的是,此时
obj2引用的那个hello还存在。obj已经赋值为空对象了,obj2里的引用的obj.hello自然也不存在了。
1.重新赋值obj对象了,新对象
obj上没有hello()方法;2.即使没有这段,你的
hello()会栈溢出的,因为这是一个递归函数,就是不停地调用自己,n就侧漏了~~以下内容纯属个人拙见,如有不妥,望不吝赐教,必将感激不尽
此函数考察内容有俩点:
1、引用类型数据的引用规则;2、函数的递归
分别阐述:
1、引用类型的引用,存储的是个地址,所以复制也是地址的复制,最后多个变量指向同一个引用类型数据。
2、递归问题: