2019年8月22日

javascript call理解

作者 admin

在js中每个函数都有两个方法:call(),apply()。这两个方法的作用就是设置函数体内this指向的值。如下面这个例子:

function sum(n, m){
    return n + m;
}

function sum1(n, m){
    return sum.call(this, n, m);
}

console.log(sum1(1, 3));   //结果是4

call传递的参数第一个是运行函数所在的作用域,一般情况我们使用的时候是this.当然也可以直接指定作用域,比如:

        var name = "han";

        var p2 = {
            name: "Anna",
            age: 25
        };

        function say(){
            console.log(this.name);
        }

        say();       //han

        say.call(p2);    //Anna

后面跟多个直接的参数,这个参数也就是当前使用函数的参数个数比如sum()有几个参数就传递几个参数。这个haoxin给的链接说明了call。而apply()只接受两个参数,一个是作用域,一个参数的数组(也可以是arguments对象)。

当然call()的真正作用还很大。它的作用还可以发挥在继承上面,这里演示一种继承方式:

        function P1(name){
            this.name = name;
            this.say = function(){
                console.log('my name is %s', this.name);
            };
        }

        function P2(name){
            P1.call(this, name);
        }

        var p = new P2("Jim");

        p.say();      //这里的结果就是‘my name is Jim’

熟练使用call()可以帮助我们很多!

 

还有个更清楚地解释:

function b(){ 有个锅,跟调料 }

function a(){ 会炒菜 }

b说:a 帮我炒个菜 a说:好的,你先把你的锅给我,再给我一些原料,

a.call(b,原料1,原料2,…);

// function P2(name){ P1.call(this, name); }

p2只有做菜技能,但是没有锅跟原料,知道p1有锅跟原料,于是借着p1的东西来 完成结果。