您好,登錄后才能下訂單哦!
這篇文章主要講解了“JavaScript中arguments.callee屬性有哪些作用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JavaScript中arguments.callee屬性有哪些作用”吧!
在函數內部,有兩個特殊的對象:arguments 和 this。其中, arguments 的主要用途是保存函數參數, 但這個對象還有一個名叫 callee 的屬性,該屬性是一個指針,指向擁有這個 arguments 對象的函數。 請看下面這個非常經典的階乘函數
function factorial(num){ if (num <=1) { return 1; } else { return num * factorial(num-1) } }
定義階乘函數一般都要用到遞歸算法;如上面的代碼所示,在函數有名字,而且名字以后也不會變 的情況下,這樣定義沒有問題。但問題是這個函數的執行與函數名 factorial 緊緊耦合在了一起。為 了消除這種緊密耦合的現象,可以像下面這樣使用 arguments.callee
function factorial(num){ if (num <=1) { return 1; } else { return num * arguments.callee(num-1); } }
在這個重寫后的 factorial()函數的函數體內,沒有再引用函數名 factorial。這樣,無論引用 函數時使用的是什么名字,都可以保證正常完成遞歸調用。例如
function factorial(num){ if(num <= 1){ return 1; }else{ return num * arguments.callee(num-1); } } var trueFactorial = factorial; alert(trueFactorial(5)); //120 factorial = function() { return 0; } alert(trueFactorial(5));// 120 如果沒有使用arguments.callee,將返回0
在此,變量 trueFactorial 獲得了 factorial 的值,實際上是在另一個位置上保存了一個函數 的指針。然后,我們又將一個簡單地返回 0的函數賦值給 factorial 變量。如果像原來的 factorial() 那樣不使用 arguments.callee,調用 trueFactorial()就會返回 0。可是,在解除了函數體內的代 碼與函數名的耦合狀態之后,trueFactorial()仍然能夠正常地計算階乘;至于 factorial(),它現 在只是一個返回 0的函數。
現在已經不推薦使用arguments.callee();
原因:訪問 arguments 是個很昂貴的操作,因為它是個很大的對象,每次遞歸調用時都需要重新創建。影響現代瀏覽器的性能,還會影響閉包。
像第三段中的例子,重寫 factorial()方法導致trueFactorial()結果不在預期。是為了演示而做的。平時寫代碼應該避免。
遞歸時用到arguments.callee()是常見的事情,比如
一道面試題。接受參數n=5,不用for循環輸出數組【1,2,3,4,5】
這用遞歸的思路,配合arguments.callee,代碼如下
function show(n) { var arr = []; return (function () { arr.unshift(n); n--; if (n != 0) { arguments.callee(); } return arr; })() } show(5)//[1,2,3,4,5]
現在arguments.callee 被棄用了。怎么辦,其實很簡單,給內部函數一個名字即可
function show(n) { var arr = []; return (function fn() { arr.unshift(n); n--; if (n != 0) { fn(); } return arr; })() } show(5)//[1,2,3,4,5]
function factorial(num) { if (num <= 1) { return 1 } var fac = 1 return (function fn() { fac *= num num-- if (num != 0) { fn() } return fac })() } factorial(5) // 120
感謝各位的閱讀,以上就是“JavaScript中arguments.callee屬性有哪些作用”的內容了,經過本文的學習后,相信大家對JavaScript中arguments.callee屬性有哪些作用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。