<script>
? ? ? ? /*
? ? ? ? ? ? arguments對(duì)象里面保存這方法的所有參數(shù)
? ? ? ? ? ? arguments對(duì)象里面有個(gè)一個(gè)callee方法,該方法指向當(dāng)前方法本身
? ? ? ? */
? ? ? ? // 定義穩(wěn)定的遞歸函數(shù)
? ? ? ? /* function clac(num){
? ? ? ? ? ? if(num === 1){
? ? ? ? ? ? ? ? return num
? ? ? ? ? ? }
? ? ? ? ? ? // 因?yàn)閍rguments.callee就是 指向當(dāng)前方法本身。
? ? ? ? ? ? // 這樣的做的好處是,防止外部方法名修改后,導(dǎo)致遞歸調(diào)用失效。
? ? ? ? ? ? let sum = num + arguments.callee(num - 1)
? ? ? ? ? ? return sum
? ? ? ? } */
? ? ? ? // 方法在定義時(shí),設(shè)置3個(gè)形參
? ? ? ? function fun1(a, b, c){
? ? ? ? ? ? console.log(a, b, c);
? ? ? ? ? ? // arguements對(duì)象里保存著方法所有的參數(shù)
? ? ? ? ? ? console.log(arguments);
? ? ? ? ? ? console.log(arguments[3]);
? ? ? ? ? ? console.log(arguments[4]);
? ? ? ? ? ? console.log('-'.repeat(50));
? ? ? ? ? ? for(let i = 0; i < arguments.length; i++){
? ? ? ? ? ? ? ? console.log(arguments[i]);
? ? ? ? ? ? }
? ? ? ? ? ? /* arguments.forEach(element => {
? ? ? ? ? ? ? ? console.log(element);
? ? ? ? ? ? ? ? // Uncaught TypeError: arguments.forEach is not a function
? ? ? ? ? ? ? ? // arguments是一個(gè)Object對(duì)象,不是一個(gè)數(shù)組對(duì)象,定義的方法體中沒有forEach()方法
? ? ? ? ? ? ? ? // 換句話說就是只有數(shù)組才可以使用froEach()方法
? ? ? ? ? ? }); */
? ? ? ? ? ? console.log('-'.repeat(50));
? ? ? ? ? ? // 注意:arguments對(duì)象里面有一個(gè)callee方法,該方法指向當(dāng)前方法本身
? ? ? ? ? ? console.log(arguments.callee); ?// 輸出方法本身的代碼塊
? ? ? ? }
? ? ? ? // 方法在調(diào)用時(shí),傳遞了5個(gè)實(shí)參
? ? ? ? // 在方法里面,另外兩個(gè)參數(shù)值就可以用arguements對(duì)象來獲取
? ? ? ? fun1(100, 200, 300, 400, 500) ?
? ? ? ? // 100 200 300
? ? ? ? // Arguments(5)?[100, 200, 300, 400, 500, callee: ?, Symbol(Symbol.iterator): ?]
? ? ? ? // 400
? ? ? ? // 500
? ? ? ? console.log('-'.repeat(50));
? ? ? ? // 計(jì)算20以內(nèi)所有數(shù)的累加
? ? ? ? // 定義一個(gè)計(jì)算器方法
? ? ? ? // function fun2(num){
? ? ? ? function calc(num){
? ? ? ? ? ? if(num === 1) return num
? ? ? ? ? ? // 因?yàn)閍rguments.callee就是 指向當(dāng)前方法本身。
? ? ? ? ? ? // 這樣的做的好處是,防止外部方法名修改后,導(dǎo)致遞歸調(diào)用失效。
? ? ? ? ? ? return num + arguments.callee(num - 1)
? ? ? ? }
? ? ? ? // console.log(fun2(20));
? ? ? ? console.log(calc(20)); ?// 210
? ? ? ? // 總之,如果在遞歸中使用到了遞歸的調(diào)用,最好將其更換為arguments.callee。
? ? ? ? // 這樣的做的好處是,防止外部方法名修改后,導(dǎo)致方法體中的遞歸調(diào)用失效。
? ? </script>