JavaScript高級程序設計(第三版),我的的讀書筆記. node
在JS函數內部,有兩個特殊的對象:arguments和this,咱們先講下arguments。 數組
arguments是一類數組對象,包含着輸入函數中的全部參數。除此以外還有一個callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數。 函數
舉一個階乘的例子文件命名爲factorial.js(在nodejs下檢驗js輸出結果): this
function factorial(num) { if(num <= 1) { return 1; }else{ return num * factorial(num - 1); } } //一樣效果的: function factorial(num) { if(num <= 1) { return 1; }else{ return num * arguments.callee(num-1); } }
這種寫法主要爲了函數的解耦,重寫的函數,不管引用函數時使用的是什麼名字,均可以保證正常的完成遞歸調用。 spa
看下面兩段代碼的執行結果: 設計
//第一段代碼 function factorial(num) { if(num <= 1) { return 1; }else{ return num * factorial(num - 1); } } var trueFactorial = factorial; factorial = function() { return 0; } console.log(trueFactorial(5)); console.log(factorial(5)); //運行結果是 //0 //0變量trueFactorial獲取了factorial值,實際上實在另外一個位置上保存了一個函數的指針,而後咱們又將簡單的返回0的函數複製給factorial變量.因此在trueFactorial執行時,內部的factorial已是被重寫了.因此輸出0 0結果~
//第二段代碼 function factorial(num) { if(num <= 1) { return 1; }else{ return num * arguments.callee(num-1); } } var trueFactorial = factorial; factorial = function() { return 0; } console.log(trueFactorial(5)); console.log(factorial(5)); //運行結果是: //120 //0
函數只是會調用自身,後面的變量複製的函數不會去覆蓋掉factorial的中的調用,因此運行結果是咱們想要的. 指針