function中的callee和caller
阿新 • • 發佈:2019-01-29
在函式內部,arguments
是一個類陣列物件
,用於儲存函式引數。
這次主要簡述一下arguments
內部存在的2個屬性:callee
,caller
callee:
callee:
是一個指標,指向擁有這個arguments
物件的函式,
例子:
function cool(){
console.log(arguments.callee);
}
cool();
//結果打印出來(chrome下):
ƒ cool(){
console.log(arguments.callee);
}
利用callee
指標的特性,我們可以用來做階乘之類的邏輯處理:
下面是最基本常見的階乘,
function add(num){
if(num<=1){
return 1;
}else{
return num * add(num-1);
}
}
add(10); //3628800
上面的階乘有個最大的問題就是,函式內部的執行與函式名add
耦合在一起,可以用arguments.callee
來消除這種耦合:
function add(num) {
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num-1 );
}
}
add(10); //3628800
caller:
caller
保留著呼叫當前函式
的函式
的引用。
function add() {
addChild();
}
function addChild() {
console.log(addChild.caller);
}
add();
//在chrome下列印結果:
ƒ add() {
addChild();
}
為了實現低耦合,可以用arguments.callee
來實現:
function add() {
addChild();
}
function addChild(argument) {
console.log(arguments.callee.caller);
}
add();
//在chrome下列印結果:
ƒ add() {
addChild();
}
*如果是在全域性作用域下呼叫該函式,caller
為null
。
function add() {
console.log(arguments.callee.caller);
}
add(); //null
注意:
arguments.callee
在嚴格模式下會導致錯誤;- 不能為
caller
賦值,否則報錯; ECMAScript5
還定義了arguments.caller
,嚴格模式下會導致錯誤,非嚴格模式下是undefined
- 定義
arguments.callee
是為了區分arguments.caller
和函式的caller
屬性。