Function中有兩個屬性,arguments與this會比較常用到。
一、arguments
arguments
只能在函數中使用,首先我們將arguments彈出來看一下。
function fn(){
console.log(arguments);
}
在chrome的控制臺中彈出來看看
發現arguments是一個數組形式的,但到底是不是數組,接著看。
function fn(){
console.log(typeof arguments);//加typeof判斷類型
}
發現arguments不是數組而是一個對象,只是它長的像一個數組。可以看到arguments中有一個callee屬性,它指向該函數本身。下面來看一下應用。
1.定義函數
//最簡單的階乘函數
function fn(num){
if( num<=1 ) return 1;
else return num * fn(num-1);
}
//執行
fn(10) //返回3628800
但是函數體中,函數的執行與函數名fn 緊密的耦合在一起,比如let foo = fn;
執行foo();
函數是不能正常工作的。為了消除這種緊密的耦合,使函數更加純方法,就用到了callee
2.改寫函數fn()
function fn(num){
if( num<=1 ) return 1;
//else return num * fn(num-1);
else return num * arguments.callee(num-1);
//將原來的fn()用 arguments.callee來代替,解耦了與函數名的依賴
}
還有一個屬性,arguments.callee.caller
顧名思義caller就是函數的調用者是誰,寫一個例子就明白了。
function outer(){
inner();
}
function inner(){
alert(arguments.callee.caller);
}
// 執行
outer(); //彈出function outer(){...}
//指向調用者outer;
二、this
在JavaScript中this
是動態的,運行時決定this指針指向誰。如果函數在全局作用域下執行,this就指向window或global,所以this是指向函數當前執行環境下的所有者。