函数内部有两个特殊的对象arguments和this
1.arguments:包含传入函数的所有参数,主要用于保存函数参数,它可以看做是一个数组
function fn(num1,num2){
console.log(arguments);
}
fn(100,200); //{'0':100,'1':200}
//arguments有一个callee的属性,它是一个指针,用来指向当前这个函数
//例如一个递归调用,阶乘函数,里面的arguments.callee就是等价于这个函数
function factorial(num){
if(num<=1){
return 1;
}
else{
return num*arguments.callee(num-1);
}
}
2.this:指向调用这个函数的对象
//全局作用域下
var hi = 'hi';
//一个普通object对象
var obj = { hi = "obj hi"};
function say(){
console.log(this.hi)
}
//say函数在全局作用域下定义,直接执行,this将指向window对象,所以hi是windows对象的。
say(); //hi
//将say赋予obj对象,并且obj来调用say,这次this将指向obj对象
obj.say = say;
obj.say(); //obj hi
1.length属性:函数接受参数的个数
function fn(n,m){};
alert(fn.length); //2
2.prototype属性:后面博客再说,厉害嘞
3.apply()和call()方法:扩充函数依赖的运行环境。就像是把一个函数给一个个的对象使用。
var color = "red";
var obj = {color: "green"};
//先声明一个函数
function fn(){
console.log(this.color);
}
//给window对象用
fn.call(window); //red
//给obj对象用
fn.call(obj); //green
apply和call功能是一样的:不同就是接受参数不同,大家第一个参数都是作用域对象,后面的apply接收一个参数数组,call则是接收一个个参数。
//声明一个函数add
function add(num1,num2){
return num1+num2;
}
//在另一个函数调用,第一个是this,后面参数一个个输入
//这里用call
function otherAdd(n1,n2){
return add.call(this,n1,n2);
}
//这里用apply,第一都是this,后面接受参数变成数组形式
function otherAdd(n1,n2){
return add.apply(this,[n1,n2]);
}