javascriptの中でcallとappyの模擬は実現します.

4043 ワード

call()call()メソッドは、指定されたthis値と、それぞれ提供されるパラメータ(パラメータのリスト)を有する関数を呼び出します.
文法:fun.call(thisArg, arg1, arg2, ...)例:
var name="lee";
var obj={
    name:"lwf"
};
function foo(){
    console.log(this.name);
}
foo();//lee(     )
foo.call();//lee,   ,this    window
foo.call(null);//,lee,  window
foo.call(undefined);//lee,  window
foo.call(obj);//lwf。   ,this  obj
var obj={
    name:"lwf"
};
function foo(age){
    console.log(age);
}
foo.call(obj,21);//21
var obj={
    name:"lwf"
};
function foo(age){
    return age;
}
console.log(foo.call(obj,21));//21
これにより、コール方法の役割が見られます.
  • パラメータがない場合、またはパラメータがnull、undefinedの場合、thisはwindow
  • を指します.
  • 複数のパラメータがあり、パラメータが不確定であれば、最初のパラメータはthisバインディングの対象となり、残りのパラメータはパラメータとしてfoo方法
  • に伝えられる.
  • foo法に戻り値があれば、コールコールを使って呼び出してもリターン値があるはずです.これにより、下記の関数が実現されました.
    Function.prototype.call2=function(context){
        var context=context||window;//              this  
        context.fn=this;//   call                  
        var args=[].slice.call(arguments,1);//              
        var result=eval('context.fn('+args+')');//    return,     
        delete context.fn;//     
        return result;
    };
    同様に、appyのアナログ実装:
    Function.prototype.apply2=function(context){
        var context=context||window;
        context.fn=this;
        var args=arguments[1];
        var result;
        if(args){
            result=eval('context.fn('+args+')');
        }else{
            result=context.fn();
        }
        delete context.fn;
        return result;
    };
    
    参考:JavaScript深入なcallとappyのシミュレーションが実現しました.