亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript arguments.callee作用及替換方案詳解

瀏覽:77日期:2023-10-16 10:06:17

一、arguments.callee的作用:返回正被執(zhí)行的 Function 對(duì)象

arguments 的主要用途是保存函數(shù)參數(shù), 但這個(gè)對(duì)象還有一個(gè)名叫 callee 的屬性,返回正被執(zhí)行的 Function 對(duì)象,也就是所指定的 Function 對(duì)象的正文,這有利于匿名函數(shù)的遞歸或者保證函數(shù)的封裝性。

請(qǐng)看下面這個(gè)非常經(jīng)典的階乘函數(shù)

function factorial(num){ if (num <=1) {return 1; } else { return num * factorial(num-1) } }

定義階乘函數(shù)一般都要用到遞歸算法;如上面的代碼所示,在函數(shù)有名字,而且名字以后也不會(huì)變的情況下,這樣定義沒有問題。但問題是這個(gè)函數(shù)的執(zhí)行與函數(shù)名 factorial 緊緊耦合在了一起。為了消除這種緊密耦合的現(xiàn)象,可以像下面這樣使用

arguments.callee

function factorial(num){ if (num <=1) {return 1; } else { return num * arguments.callee(num-1); } }

在這個(gè)重寫后的 factorial()函數(shù)的函數(shù)體內(nèi),沒有再引用函數(shù)名 factorial。這樣,無論引用函數(shù)時(shí)使用的是什么名字,都可以保證正常完成遞歸調(diào)用。例如

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 的值,實(shí)際上是在另一個(gè)位置上保存了一個(gè)函數(shù)的指針。然后,我們又將一個(gè)簡單地返回 0的函數(shù)賦值給 factorial 變量。如果像原來的 factorial() 那樣不使用 arguments.callee,調(diào)用 trueFactorial()就會(huì)返回 0。可是,在解除了函數(shù)體內(nèi)的代碼與函數(shù)名的耦合狀態(tài)之后,trueFactorial()仍然能夠正常地計(jì)算階乘;至于factorial(),它現(xiàn)在只是一個(gè)返回 0的函數(shù)。

二、arguments.callee的替換方案

現(xiàn)在已經(jīng)不推薦使用arguments.callee();

原因:訪問 arguments 是個(gè)很昂貴的操作,因?yàn)樗莻€(gè)很大的對(duì)象,每次遞歸調(diào)用時(shí)都需要重新創(chuàng)建。影響現(xiàn)代瀏覽器的性能,還會(huì)影響閉包。

不能用怎么辦?

遞歸時(shí)用到arguments.callee()是常見的事情,比如一道面試題。接受參數(shù)n=5,不用for循環(huán)輸出數(shù)組【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]

現(xiàn)在arguments.callee 被棄用了。怎么辦,其實(shí)很簡單,給內(nèi)部函數(shù)一個(gè)名字即可(當(dāng)函數(shù)被調(diào)用時(shí),它的arguments.callee對(duì)象就會(huì)指向自身,也就是一個(gè)對(duì)自己的引用。)

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]

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 精品一区二区三区高清免费不卡 | 国产国产成人久久精品杨幂 | 久久日本精品国产精品白 | 久久久久女人精品毛片 | 青青青国产精品国产精品久久久久 | 超级乱淫片67194免费看 | 59pao成国产成视频永久免费 | 岛国毛片一级一级特级毛片 | 国产一区二区影视 | 草草免费观看视频在线 | va在线视频 | 国产精品三级在线观看 | 亚洲国产片 | 青青热久免费精品视频在首页 | 午夜激情视频在线观看 | 国产中文字幕亚洲 | 黄色片中国 | 亚洲欧美日韩专区一 | 国产精品3| 青青青草网站免费视频在线观看 | 一级特黄国产高清毛片97看片 | 青青草一区国产97 | 日韩欧美国产高清在线观看 | 日本一本高清v免费视频 | 亚洲午夜精品一级在线 | 免费国产在线观看不卡 | 曰本黄色毛片 | 久久国产精品自由自在 | 香蕉久久一区二区三区 | 欧美精品在线一区二区三区 | 狼人青草久久网尹人 | 国产欧美日韩第一页 | 日韩中文字幕一在线 | 精品久久久久久国产免费了 | 国产精品每日在线观看男人的天堂 | 999久久久免费精品国产牛牛 | 亚洲国产欧美国产第一区二区三区 | 夜恋全部国产精品视频 | 亚洲视频在线观看视频 | 国产 在线 | 日韩 | 中国女人特级毛片 |