關于引用類型的思考
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....),變量整體重新賦值耸黑,相當于重新開辟了一塊內存玷室。內存指針變了茸炒。和原來無關了。被賦值對象依然和原引用類型舊值相同阵苇。
更進一步
函數(shù)定遞歸
function digui(num){
if(num == 1)
return 1;
else
return num*digui(num-1)
}
var digui2 = digui
digui = null
digui2(4)
函數(shù)digui 被賦NULL 壁公,就如同上述,開辟了新的內存空間绅项。但是紊册,遞歸調用時return 出 依然引用的是digui(這時候已經是NULL了)。會報出digui is not a function的error快耿。
解決:改成return num*arguments.callee(num-1)
arguments.callees 指向正在執(zhí)行的函數(shù)指針囊陡,也就是指向digui2。所以在寫遞歸函數(shù)時掀亥,為了安全性撞反,更推薦這種寫法。
但是最好的遞歸寫法是用函數(shù)聲明式
解決:
var digui=(function f(num){......return ...f(..)})