arguments
是個類數組對象,用來保存傳入函數中的所有參數,也就是實參對象
-
arguments
對象有個屬性叫callee
,該屬性是個指針,指向擁有這個arguments
對象的函數
//下面是一個階乘函數,用了遞歸算法,但問題是函數執行和函數名的耦合性較高,也就是說如果有一天函數名改了或者本身是個匿名函數,那么必須也要修改函數內部
function factorial(num){
if(num<=1){
return 1;
}else{
return num * factorial(num-1);
}
}
//于是為了消除緊密耦合,可以使用arguments.callee
function factorial(num){
if(num<=1){
return 1;
}else{
return num * arguments.callee(num-1); //這里不需要再使用函數名了
}
}
-
ECMAScript5
規范了另一個函數對象的屬性:caller
,保存著調用當前函數的函數的引用(當前函數的直接父函數),如果在全局作用域中調用,它的值為null
function outer(){
inner();
}
function inner(){
console.log(inner.caller); //返回outer函數體
}
outer();
//同樣可以用此屬性松散耦合性
function outer(){
inner();
}
function inner(){
console.log(arguments.callee.caller); //返回outer函數體
}
outer();