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是指向函数当前执行环境下的所有者。
网友评论