js函數的遞歸調用方法
1.通過函數自身名字遞歸調用
function sum(num){ if(num<=1){ return 1; }else{ return num+sum(num-1); } } console.log(sum(5));//15
這種通過函數名字調用自身的方式存在一個問題:函數的名字是一個指向函數對象的指針,如果我們把函數的名字與函數對象本身的指向關系斷開,這種方式運行時將出現錯誤。
2.通過arguments.callee調用函數自身
function sum(num){ if(num<=1){ return 1; }else{ return num+arguments.callee(num-1); } } console.log(sum(5));//15 var sumAnother=sum; console.log(sumAnother(5));//15 sum=null; console.log(sumAnother(5));//15
這種方式很好的解決了函數名指向變更時導致遞歸調用時找不到自身的問題。但是這種方式也不是很完美,因為在嚴格模式下是禁止使用arguments.callee的。
3.通過函數命名表達式來實現arguments.callee的效果。
var sum=(function(){ 'use strict' return function fun(num){ if(num<=1){ return 1; }else{ return num+fun(num-1); } } })() console.log(sum(5));//15 var sumAnother=sum; console.log(sumAnother(5));//15 sum=null; console.log(sumAnother(5));//15