1.callee
//递归
function add(x){
if(x == 1)
return 1;
else
//callee 返回正被执行的 Function 对象
return x + arguments.callee(x-1);
}
console.log(add(4));
2.caller 返回一个对函数的引用,该函数调用了当前函数
function fntestcaller(){
var a = fntestcaller.caller.name;
alert(a);
}
function handleCaller() {
fntestcaller();
}
handleCaller();
3.call apply
function fn1(){
this.name="fn1";
this.say=function(){
alert("say:"+this.name);
}
}
function fn2(a){
this.name="fn2";
}
var f1=new fn1();
var f2=new fn2();
//调用一个对象的一个方法,以另一个对象替换当前对象。
//相当于f2也有了函数f1的say方法
f1.say.call(f2);//结果alert(say:fn2)
//应用某一对象的一个方法,用另一个对象替换当前对象。
f1.say.apply(f2);//结果alert(say:fn2)
//区别:传入的参数 不同
/*
apply只有两个参数,第一个参数是要用来
“代替”这个function对象实例里面的this的对象,变量
而第二个参数是传递给这个function对象的所有参数组合而成的数组
call的第一个参数的含义和apply的完全一样,但是第二个以后的参数
则是传递给这个function对象的参数
*/
4.将argument转换成数组
//把argument变成数组
var args = Array.prototype.slice.call(arguments, 0);
5.自定义回调函数
function fnTestCallBackFunc(bf){
bf.apply(this,[1]);
return this;
}
fnTestCallBackFunc(function(data){
alert(data);
});
6.子窗口调用父窗口的方法,获取返回值,并以回调函数的形式将子窗口的值通过函数返回给父窗口