js callee,caller學習

原文地址: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()函數自己內容!

 

參考:理解JavaScript中的arguments,callee,caller,apply this

JavaScript 之arguments、caller 和 callee 介紹spa

相關文章
相關標籤/搜索