callee,caller
1、callee 被调用者,是类数组对象arguments的属性 ,arguments.callee 返回对函数自身的引用,常用于匿名函数中;
2、arguments.length 返回实参个数,arguments.callee.length 返回形参个数。
ex1:
(function (a,b){
console.log(arguments.length); // 3
console.log(arguments.callee.length) ; // 2
})(1,2,3)
ex2:
var factorial = function(x){
if(x <= 1){
return 1;
}
return x * arguments.callee(x - 1); //回调函数自身
}
alert(factorial(5)); //120
3、fn.caller 调用者,是函数对象的属性,保存着调用当前函数的函数的引用。若fn是在全局作用域下调用的 则 返回null。
ex1:
function outer(){
inner();
}
function inner(){
console.log(inner.caller);
}
outer(); // outer(){ inner();}
ex2:
function fn(){
console.log(fn.caller);
}
fn() // null
apply, call,
1、call ,apply是函数(函数对象)的方法。
2、call,apply改变执行上下文this的指向和实现继承;改变this指向还有一个bind,但bind需要被调用才执行。
3、可以把一个对象的方法作为另一个对象的方法来引用。
ex1:
function o1(value){
if(value < 100){
this.value = value;
}else{
this.value = 100;
}
}
function o2(value){
o1.call(this,value); //改变o1函数中,上下文对象this的指向
alert(this.value);
}
var o = new o2(133554) //100 改变了this的指向
ex2:
function c1(){
this.m1 = function(){
alert(this.name);
}
}
function c2(){
this.name = “mike”;
}
var nc1 = new c1();
var nc2 = new c2(); //必须
nc1.m1.call(nc2); //mike 把方法m1作为对象nc2的方法来引用
ex3:
function o1(arg){
if (arguments[1] < 100) {
this.value = arguments[1] ;
}
else {
this.value = 100;
}
}
function o2(arg){
o1.apply(this, arg); //参数只能是数组
alert(this.value);
}
var o = new o2([101,60]) //60
4、使用apply最大的好处,可以将当前函数的arguments对象(arguments是伪数组)作为apply的第二个参数传入。