call使用情况
1.class.call(obj)
让obj进入class的上下文执行,替代this指针。
2.class.call(class)
3.obj1.method.call(obj2);
改变obj1.method方法中上下文执行,替代this指针。(只改变了method方法中的this,没有改变class中的this)
4.fn.call(fn) 与 class.call(class) 一样,只是 没有this,也就是单纯的改变函数的执行环境。
function add(a,b){
alert(a+b);
}
function sub(a,b){
alert(a-b);
}
add.call(sub,3,1); //4 add中没有this,所以sub直接忽略
5.*此引用和第4点差不多,只是有一点变化,fn也就是函数,每个函数都属于Function.prototype,所以都有call apply方法。
function f1(){
alert(1);
}
function f2(){
alert(2);
}
var f3 = f1.call;
f1.call(f2);//1
f3.call(f2);//2 等效 f1.call.call(f2)
/***下面例子复杂一点***/
function jsCall(oThis){
var argsNew = [];
for(var i=1;i<arguments.length;i++){
argsNew.push(arguments[i]);
}
// alert(this);
return this.apply(oThis,argsNew); //这里的this就是当前执行函数
}
Function.prototype.jsCall = jsCall;
function f1(a){
alert([this,a,'f1']);
}
// f1.jsCall = function (oThis){
// var argsNew = [];
// for(var i=1;i<arguments.length;i++){
// argsNew.push(arguments[i]);
// }
//
// // alert(this);
// return this.apply(oThis,argsNew);
// }
function f2(a){
alert([this,a,'f2']);
}
// f1(33);
f1.jsCall(f2,11); //f2直接替换f1中的this