亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript中caller和callee詳解

2019-11-20 11:52:46
字體:
來源:轉載
供稿:網友

最近學習javascript,碰到caller和callee的問題,去網上百度了很多。搜到的內容大同小益,整理總結了一下與大家分享。

caller:返回一個對調用function函數的函數的引用(用法:function.caller)

說明:對于函數來說,caller屬性只有在函數執行時才有定義。如果函數由頂層調用,caller則為null。

var time = 3 //控制次數,去掉會一直在caller與handleCaller交替不斷執行function caller() {  caller.caller()//返回調用caller函數的函數引用}function handleCaller() {  if (time > 0){    time--    alert(handleCaller.caller)//返回調用handleCaller函數的函數引用    alert(caller.caller)//返回調用caller函數的函數引用    caller()  }}handleCaller()

例子分析:第一次handleCaller運行的時候,兩個alert返回的都是null,alert(handleCaller.caller)返回null是因為它是由頂層調用, alert(caller.caller)返回null是因為caller的默認值是null。接下去caller()函數被調用,caller.caller返回的是調用它的函數(handleCaller)的引用,通過caller.caller()可以再次調用handleCaller函數。第二次handleCaller運行的時候,alert(handleCaller.caller)返回的是caller代碼(其實就是caller的引用),alert(caller.caller)返回的是handleCaller代碼。因為函數之間的調用關系是handleCaller->caller->handleCaller。之后就不斷在2個函數之間交替執行。

caller指向調用當前函數的函數,但是有一點,如果是在全局作用域內(即頂層window)被調用,則返回null。
代碼走起

====================function testCaller(){if(testCaller.caller == null){console.log('accessed at global');}else{console.log('accessed at ' + testCaller.caller);}}


在全局調用

testCaller(); // accessed at global

在一個函數中調用

function a(){testCaller();}a(); // accessed at function a(){testCaller();} 

此時,testCaller.caller指向就是 function a

callee:返回相對應的arguments的函數引用。(多用于匿名函數遞歸)

說明:也許你在網上看到最多的是callee返回正在執行的函數引用。我是這么理解,每個函數都有一個自己的arguments,通常是用來存放參數的。arguments有一個callee 屬性,初始值就是對應自身的函數引用。當你函數執行到該語句時,arguments是默認對應的是你現在執行的函數,那么arguments.callee為當前正在執行的函數的引用。當然如果你有標記過其他函數的arguments(例子中的args),自然可以用args.callee()去再次調用那個函數。

function a(){  alert(arguments.callee)  var args = arguments  function c(){    alert(arguments.callee)    args.callee()  }  c()}a()

例子分析:例子中的arguments.callee都是默認返回當前正在執行的函數的引用(a中返回a自身函數引用,c中返回c自身函數引用),而通過用args存放a函數的arguments,在內置函數c中使用args.callee()再次調用a函數。

====================function a(x){if(x<=1)return x;elsereturn x + a(x-1);}a(12) // 78

這是一個極簡的遞歸,運行結果正常。


再看看下面的調用方法

var b = a;a = null; // 將a回收b(12); // erro : 'a' is not a function

原因也簡單,b=a,b=function a(){};在b調用之前,我們用了a=null。所以在 function a 運行的時候,其中的return x + a(x-1);中的a,指向的就是null,而不是 function a。
所以就報錯了,如何解決這樣的問題。我們將a換一種寫法

function a(x){if(x<=1)return x;elsereturn arguments.callee(x-1); // 這句是改變的地方}

再調用

var b = a;a = null;b(12); // 78

原因:雖然我們將a=null了,但是函數a中并沒有用到a,而是通過arguments.callee指向當前函數。
因為arguments.callee的定義就是:返回正在執行的函數。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品动漫久久久久| 精品国产一区二区三区久久狼5月| 国产欧美亚洲视频| 亚洲一区中文字幕| 国产精品亚洲美女av网站| 97在线精品国自产拍中文| 57pao成人国产永久免费| 久久精品国产成人精品| 久久91精品国产91久久久| 97精品一区二区三区| 丰满岳妇乱一区二区三区| 欧美日韩美女视频| 日韩精品小视频| 色爱av美腿丝袜综合粉嫩av| 日韩亚洲欧美成人| 色99之美女主播在线视频| 一本一本久久a久久精品牛牛影视| 久久夜色精品国产亚洲aⅴ| 久久久久久国产三级电影| 成人在线精品视频| 成人av.网址在线网站| 伦伦影院午夜日韩欧美限制| 亚洲最大福利网站| 亚洲欧美国产精品va在线观看| 国产精品高潮视频| 国产成人亚洲综合青青| 亚洲永久免费观看| 亚洲无限av看| 日韩中文字幕网址| 亚洲最大成人在线| 91欧美日韩一区| 国产精品电影一区| 日本一区二区三区四区视频| 性欧美办公室18xxxxhd| 中文字幕亚洲二区| 日韩在线观看免费全集电视剧网站| 国模极品一区二区三区| 日韩欧美有码在线| 国产精品嫩草视频| 国产精品网站视频| 成人午夜一级二级三级| 亚洲精品美女网站| 久久精品视频一| 欧美亚洲免费电影| 国产精品视频最多的网站| 国产精品www| 欧美日韩福利电影| 国产中文欧美精品| 91久久久久久久久| 国产精品中文字幕在线观看| 日韩精品亚洲元码| 欧美日韩国产第一页| 国产精品国模在线| 亚洲福利在线播放| 在线精品国产成人综合| 大荫蒂欧美视频另类xxxx| 亚洲天天在线日亚洲洲精| 日韩精品视频中文在线观看| 日本国产高清不卡| 亚洲一级黄色av| 亚洲成人激情小说| 国产99久久久欧美黑人| 亚洲香蕉成人av网站在线观看| 亚洲激情视频网站| 欧美丰满老妇厨房牲生活| 国产一级揄自揄精品视频| 久久网福利资源网站| 国产亚洲免费的视频看| 亚洲欧美一区二区三区在线| 亚洲精品福利免费在线观看| 亚洲精品日韩丝袜精品| 欧美日韩亚洲精品内裤| 91精品国产精品| 欧美一级视频在线观看| 97在线视频一区| 色噜噜狠狠狠综合曰曰曰| 91视频国产高清| 亚洲视频网站在线观看| 亚洲xxxx视频| 亚洲乱亚洲乱妇无码| 国产成人精品日本亚洲专区61| 日韩欧美国产黄色| 国产日本欧美一区二区三区在线| 亚洲欧美国产视频| 动漫精品一区二区| 亚洲级视频在线观看免费1级| 在线观看日韩欧美| 国产精品极品美女粉嫩高清在线| 成人欧美在线视频| 亚洲高清久久久久久| 国外成人在线视频| 欧美成人精品在线视频| 亚洲国产一区二区三区四区| 欧美亚洲国产日本| 国产视频在线观看一区二区| 97在线看免费观看视频在线观看| 亚洲欧美日韩视频一区| 日日噜噜噜夜夜爽亚洲精品| 日韩电影免费在线观看中文字幕| 自拍偷拍亚洲精品| 九色精品免费永久在线| 亚洲精品日韩激情在线电影| 亚洲免费一在线| 日韩网站在线观看| 亚洲视频精品在线| 国产中文日韩欧美| 亚洲国产一区自拍| 日本午夜人人精品| 日韩在线视频中文字幕| 一区二区三区在线播放欧美| 久久夜色撩人精品| 久久久国产一区二区三区| 欧美性感美女h网站在线观看免费| 亚洲精品久久久久| 欧美中文在线观看国产| 亚洲国产精品99| 日韩电影免费观看在线观看| 亚洲国产精品va在看黑人| 亚洲春色另类小说| 97欧美精品一区二区三区| 精品高清美女精品国产区| 91地址最新发布| 中文字幕国产精品| 久久夜色精品亚洲噜噜国产mv| 欧美一区二区三区四区在线| 国产成人综合亚洲| 国产日韩在线免费| 欧美大片免费观看在线观看网站推荐| 国产成人精品网站| 亚洲天堂av在线免费观看| 亚洲欧洲黄色网| 亚洲午夜精品视频| 69久久夜色精品国产69| 国产视频欧美视频| 日韩av片电影专区| 国产成人一区二区三区| 日日狠狠久久偷偷四色综合免费| 国产一区二中文字幕在线看| 一区二区三区回区在观看免费视频| 亚洲剧情一区二区| 曰本色欧美视频在线| 精品国产一区二区三区久久狼黑人| 欧美激情久久久久| 亚洲va欧美va国产综合久久| 这里只有精品在线观看| 久久久精品亚洲| 超碰97人人做人人爱少妇| 色偷偷亚洲男人天堂| 国产精品观看在线亚洲人成网| 日韩美女免费线视频| 欧美精品一区在线播放| 日韩欧美视频一区二区三区| 日韩精品在线影院| 色老头一区二区三区在线观看| 性欧美激情精品| 亚洲国产91色在线| 欧美成人精品三级在线观看| 91精品国产高清久久久久久91| 国内精品久久久久| 日韩av毛片网| 亚洲精品电影在线| 国产成人在线一区| 91国内免费在线视频| 色樱桃影院亚洲精品影院|