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);
}
}
this
this指向函数执行时所处的作用域。在全局作用域中调用函数时,指向window。 (这种表示不太准确,但我觉得会好理解一点。)
var color ='red';
var obj = {color:'blue'};
function sayColor() {
return this.color;
}
sayColor();//red
obj.sayColor = sayColor;
obj.sayColor(); //blue
call()和apply()
call() 和apply()在特定作用域 调用函数,说白了也就是设置this对象的值,扩充作用域。都包含两个参数,第一个参数是作用域,第二个是传入的参数。
两者接收第二个参数,也就是【传入参数】的方式不同,call() 要一个一个传入,apply接收数组。
function sum(num1, num2) {
return num1+num2;
}
function callSum(num1,num2) {
return sum.call(this, num1, num2);
}
function applySum(num1, num2) {
return sum.apply(this, arguments);
//return sum.apply(this, [num1, num2]);
}
callSum(10,10);//20
applySum(10, 10);//20
//可以与上面this里的例子做个比较
var color ='red';
var obj = {color:'blue'};
function sayColor() {
return this.color;
}
sayColor();//red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(obj); //blue