關于引用類型的思考
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 指向正在執(zhí)行的函數指針,也就是指向digui2。所以在寫遞歸函數時,為了安全性,更推薦這種寫法。
但是最好的遞歸寫法是用函數聲明式
解決:
var digui=(function f(num){......return ...f(..)})