关于引用类型的思考
var obj={
a:1
}
var obj2=obj
obj.b=4
console.log(obj2)
obj=null
console.log(obj2)
输出结果

image.png
总结
引用类型虽然说是通过地址访问,改变原引用类型对象也会同步改变被赋值对象。但是,当原引用类型对象被置空的时候(或置其他值:1,"abc",{a:2},true....),变量整体重新赋值,相当于重新开辟了一块内存。内存指针变了。和原来无关了。被赋值对象依然和原引用类型旧值相同。
更进一步
函数定递归
function digui(num){
if(num == 1)
return 1;
else
return num*digui(num-1)
}
var digui2 = digui
digui = null
digui2(4)
函数digui 被赋NULL ,就如同上述,开辟了新的内存空间。但是,递归调用时return 出 依然引用的是digui(这时候已经是NULL了)。会报出digui is not a function的error。
解决:改成return num*arguments.callee(num-1)
arguments.callees 指向正在执行的函数指针,也就是指向digui2。所以在写递归函数时,为了安全性,更推荐这种写法。
但是最好的递归写法是用函数声明式
解决:
var digui=(function f(num){......return ...f(..)})