最關鍵的地方是獲得調用者的名稱,需要用到 arguments 對象讀取 js 的調用棧。
function search(){
// 以下兩句是等效的
alert(search.caller.name);
alert(arguments.callee.caller.name)
}
function baidu(){
search();
}
function google(){
search();
}
google();
baidu();
執行以上代碼會分別得到 google 和 baidu。下面是對調用的對象分解解說:
name 和 caller 屬性:
在 js(正確的名稱應該是:ECMAScript) 裏壹切都是對象,變量就不用說了,連函數也是作為對象存在的。每個函數都有 name 和 caller 屬性,name 屬性返回函數的名稱,而 caller 屬性返回的是調用它的函數對象(是對象不是名稱)。
arguments 對象及它的 callee 屬性:
而函數在調用開始會生成壹個 arguments 對象,這個對象不光能讀取到轉遞給函數的參數,還能通過 callee 屬性返回生成它的函數對象,在上面的例子中 arguments.callee == search 函數對象,使用 arguments.callee 的好處是當 search 函數改名也不會影響程序的正確性。
根據以上兩條,不難得到 arguments.callee.caller.name 就是當前函數的調用者名稱了