原文地址:js callee,caller學習javascript
/*
* caller 返回一個對函數的引用,該函數調用了當前函數。
* 若是函數是由頂層調用的,那麼 caller包含的就是 null 。
* 若是在字符串上下文中使用 caller屬性,那麼結果和 functionName.toString
* 同樣,也就是說,顯示的是函數的反編譯文本。html
* 在一個函數調用另外一個函數時,被調用函數會自動生成一個caller屬性,指向調用它的函數對象。若是該函數當前未被調用,或並不是被其餘函數調用,則caller爲null。java
*/app
function callerDemo() { if (callerDemo.caller) { // var a= callerDemo.caller.toString(); // alert(a); //等價於下面表達式 alert(callerDemo.caller); } else { alert("this is a top function"); } } function handleCaller() { callerDemo(); } // handleCaller(); // callerDemo();
/*-------------------------------------------------------
* callee 返回正被執行的 Function 對象,也就是所指定的 Function 對象的正文。
* callee屬性是 arguments 對象的一個成員,它表示對函數對象自己的引用,
* 這有利於匿名函數的遞歸或者保證函數的封裝性
* 該屬性僅當相關函數正在執行時纔可用
* arguments.length是實參長度,arguments.callee.length是形參長度,
* 由此能夠判斷調用時形參長度是否和實參長度一致。
*/函數
function calleeDemo() { // alert(n); // arguments.callee(n-1); alert(arguments.callee); } // calleeDemo(); //返回函數toString形式 //遞歸計算 var sum = function(n){ if (n <= 0) return 1; else return n + arguments.callee(n - 1); // arguments.callee調用當前正在執行的函數,即sum自己! } // alert(sum(3));
/*----------------------------------------
* 兩者區別
*/學習
function inner(){ alert(arguments.callee);//指向擁有這個arguments對象的函數,即inner() alert(arguments.callee.caller);//這個屬性保存着調用當前函數的函數的引用,即outer() } function outer(){ inner(); } // outer();//先彈出inner()函數再彈出outer()函數自己內容!