文章參考http://www.jb51.net/article/25561.htm
?
先看兩個小例子,讓您有個大概印象
function myfunc() {
if (myfunc.caller) {
alert(myfunc.caller);
//alert(myfunc.caller.toString());
} else {
alert("函數直接執行");
}
}
function handleCaller() {
myfunc();
}
handleCaller();
myfunc();
?大家會發現第一個alert會彈出調用myfunc函數的調用者handleCaller,
而第二個alert由于沒有在其他函數體內調用,所以myfunc.caller為null,就執行了 alert("函數直接執行");?
?
function calleeLengthDemo(arg1, arg2) {
alert(arguments.callee);
//alert(arguments.callee.toString());
if (arguments.length == arguments.callee.length) {
window.alert("驗證形參和實參長度正確!");
return;
} else {
alert("實參長度:" + arguments.length);
alert("形參長度: " + arguments.callee.length);
}
}
calleeLengthDemo(1);
? 第一個消息框彈出calleeLengthDemo函數本身,這說明callee就是函數本身對象的引用。 callee還有個非常有用的應用就是用來判斷實際參數跟行參是否一致 。上面的代碼第一個消息框會彈出實際參數的長度為1,形式參數也就是函數本身的參數長度為2.?
?
?caller
返回一個對函數的引用, 該函數調用了當前函數 。
? ? functionName.caller?
? ? functionName 對象是所執行函數的名稱。
說明:
對于函數來說, caller屬性只有在函數執行時才有定義。如果函數是由頂層調用的,那么 caller包含的就是 null 。如果在字符串上下文中使用 caller屬性,那么結果和 functionName.toString 一樣,也就是說,顯示的是函數的反編譯文本,
注意:Function.toString() 可以實現 Function 的反編譯功能.如加上遞歸功能則功能更加強大
下面的例子說明了 caller 屬性的用法:
?
function callerDemo() {
if (callerDemo.caller) {
var a= callerDemo.caller.toString();
alert(a);
} else {
alert("this is a top function");
}
}
function handleCaller() {
callerDemo();
}
??
?callee ??
?返回正被執行的 Function 對象,也就是所指定的 Function 對象的正文。
[function.]arguments.callee可選項 function參數是當前正在執行的 Function對象的名稱 。
說明callee屬性的初始值就是正被執行的 Function 對象。
callee屬性是 arguments 對象的一個成員,它表示對函數對象本身的引用,這有利于匿名函數的遞歸或者保證函數的封裝性,例如下邊示例的遞歸計算1到n的自然數之和。而該屬性僅當相關函數正在執行時才可用。還有需要注意的是callee擁有length屬性,這個屬性有時候用于驗證還是比較好的。
arguments.length是實參長度,arguments.callee.length是形參長度,由此可以判斷調用時形參長度是否和實參長度一致。示例
?
function calleeDemo() {
alert(arguments.callee);
}
//用于驗證參數
function calleeLengthDemo(arg1, arg2) {
if (arguments.length==arguments.callee.length) {
window.alert("驗證形參和實參長度正確!");
return;
} else {
alert("實參長度:" +arguments.length);
alert("形參長度: " +arguments.callee.length);
}
}
??
?如何利用arguments.callee來執行遞歸函數
?
傳統實現方式
var sum = function(n){
if (1==n) return 1;
else return n + sum (n-1);
}
?
缺點:函數內部包含了對自身的引用,函數名僅僅是一個變量名,在函數內部調用即相當于調用?
一個全局變量,不能很好的體現出是調用自身,這時使用callee會是一個比較好的方法?
??
var sum = function(n){
if (n <= 0)
return 1;
else
return n + arguments.callee(n - 1)
}
?
調用時:alert(sum(100));
其中函數內部包含了對sum自身的引用,函數名僅僅是一個變量名,在函數內部調用sum即相當于調用一個全局變量,不能很好的體現出是調用自身,這時使用callee會是一個比較好的方法。
?
?
<script type="text/javascript" >
function test(event){
//彈出調用test方法的函數
alert(test.caller);
//彈出test方法的字符串
alert(arguments.callee);
}
</script>
<input onclick="test(event)"/>
?
??
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

