文章參考http://www.jb51.net/article/25561.htm
?
先看兩個(gè)小例子,讓您有個(gè)大概印象
function myfunc() { if (myfunc.caller) { alert(myfunc.caller); //alert(myfunc.caller.toString()); } else { alert("函數(shù)直接執(zhí)行"); } } function handleCaller() { myfunc(); } handleCaller(); myfunc();
?大家會(huì)發(fā)現(xiàn)第一個(gè)alert會(huì)彈出調(diào)用myfunc函數(shù)的調(diào)用者h(yuǎn)andleCaller,
而第二個(gè)alert由于沒(méi)有在其他函數(shù)體內(nèi)調(diào)用,所以myfunc.caller為null,就執(zhí)行了 alert("函數(shù)直接執(zhí)行");?
?
function calleeLengthDemo(arg1, arg2) { alert(arguments.callee); //alert(arguments.callee.toString()); if (arguments.length == arguments.callee.length) { window.alert("驗(yàn)證形參和實(shí)參長(zhǎng)度正確!"); return; } else { alert("實(shí)參長(zhǎng)度:" + arguments.length); alert("形參長(zhǎng)度: " + arguments.callee.length); } } calleeLengthDemo(1);
? 第一個(gè)消息框彈出calleeLengthDemo函數(shù)本身,這說(shuō)明callee就是函數(shù)本身對(duì)象的引用。 callee還有個(gè)非常有用的應(yīng)用就是用來(lái)判斷實(shí)際參數(shù)跟行參是否一致 。上面的代碼第一個(gè)消息框會(huì)彈出實(shí)際參數(shù)的長(zhǎng)度為1,形式參數(shù)也就是函數(shù)本身的參數(shù)長(zhǎng)度為2.?
?
?caller
返回一個(gè)對(duì)函數(shù)的引用, 該函數(shù)調(diào)用了當(dāng)前函數(shù) 。
? ? functionName.caller?
? ? functionName 對(duì)象是所執(zhí)行函數(shù)的名稱。
說(shuō)明:
對(duì)于函數(shù)來(lái)說(shuō), caller屬性只有在函數(shù)執(zhí)行時(shí)才有定義。如果函數(shù)是由頂層調(diào)用的,那么 caller包含的就是 null 。如果在字符串上下文中使用 caller屬性,那么結(jié)果和 functionName.toString 一樣,也就是說(shuō),顯示的是函數(shù)的反編譯文本,
注意:Function.toString() 可以實(shí)現(xiàn) Function 的反編譯功能.如加上遞歸功能則功能更加強(qiáng)大
下面的例子說(shuō)明了 caller 屬性的用法:
?
function callerDemo() { if (callerDemo.caller) { var a= callerDemo.caller.toString(); alert(a); } else { alert("this is a top function"); } } function handleCaller() { callerDemo(); }
??
?callee ??
?返回正被執(zhí)行的 Function 對(duì)象,也就是所指定的 Function 對(duì)象的正文。
[function.]arguments.callee可選項(xiàng) function參數(shù)是當(dāng)前正在執(zhí)行的 Function對(duì)象的名稱 。
說(shuō)明callee屬性的初始值就是正被執(zhí)行的 Function 對(duì)象。
callee屬性是 arguments 對(duì)象的一個(gè)成員,它表示對(duì)函數(shù)對(duì)象本身的引用,這有利于匿名函數(shù)的遞歸或者保證函數(shù)的封裝性,例如下邊示例的遞歸計(jì)算1到n的自然數(shù)之和。而該屬性僅當(dāng)相關(guān)函數(shù)正在執(zhí)行時(shí)才可用。還有需要注意的是callee擁有l(wèi)ength屬性,這個(gè)屬性有時(shí)候用于驗(yàn)證還是比較好的。
arguments.length是實(shí)參長(zhǎng)度,arguments.callee.length是形參長(zhǎng)度,由此可以判斷調(diào)用時(shí)形參長(zhǎng)度是否和實(shí)參長(zhǎng)度一致。示例
?
function calleeDemo() { alert(arguments.callee); } //用于驗(yàn)證參數(shù) function calleeLengthDemo(arg1, arg2) { if (arguments.length==arguments.callee.length) { window.alert("驗(yàn)證形參和實(shí)參長(zhǎng)度正確!"); return; } else { alert("實(shí)參長(zhǎng)度:" +arguments.length); alert("形參長(zhǎng)度: " +arguments.callee.length); } }
??
?如何利用arguments.callee來(lái)執(zhí)行遞歸函數(shù)
?
傳統(tǒng)實(shí)現(xiàn)方式
var sum = function(n){ if (1==n) return 1; else return n + sum (n-1); }
?
缺點(diǎn):函數(shù)內(nèi)部包含了對(duì)自身的引用,函數(shù)名僅僅是一個(gè)變量名,在函數(shù)內(nèi)部調(diào)用即相當(dāng)于調(diào)用?
一個(gè)全局變量,不能很好的體現(xiàn)出是調(diào)用自身,這時(shí)使用callee會(huì)是一個(gè)比較好的方法?
??
var sum = function(n){ if (n <= 0) return 1; else return n + arguments.callee(n - 1) }
?
調(diào)用時(shí):alert(sum(100));
其中函數(shù)內(nèi)部包含了對(duì)sum自身的引用,函數(shù)名僅僅是一個(gè)變量名,在函數(shù)內(nèi)部調(diào)用sum即相當(dāng)于調(diào)用一個(gè)全局變量,不能很好的體現(xiàn)出是調(diào)用自身,這時(shí)使用callee會(huì)是一個(gè)比較好的方法。
?
?
<script type="text/javascript" > function test(event){ //彈出調(diào)用test方法的函數(shù) alert(test.caller); //彈出test方法的字符串 alert(arguments.callee); } </script> <input onclick="test(event)"/>
?
??
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
