call 方法和 apply 方法的作用及意义是什么?什么时候使用?

原文出处:汇智网

call()apply()都是JavaScript 中函数对象上的方法:

var f = function () {};

'call' in f; // true

'apply' in f; // true

说到函数,JavaScript 中有个this的概念与函数调用相关,this指向一个对象,表示函数调用时的执行上下文;当在函数内引用this的时候,就会指向这个对象。

var man = {

    name: 'Jason',

    sayName: function() { 

        console.log(this.name); 

   }

}

man.sayName(); // 输出'Jason' 

上面的例子中,sayName()是对象man上的方法,sayName()this指向sayName()所在的对象(即man),this.name实际上是man.name,因此最后输出'Jason'。

如果函数不是对象上的方法,那this默认情况下会指向全局上下文,在浏览器中,也就是window

window.name = 'Tommy'

function foo() {

    console.log(this.name);

}

foo(); // `this`指向`window`,所以输出'Tommy'

明白了this之后,call()apply()就好解释了。这两个方法的作用是在函数调用时改变函数的执行上下文,也就是函数内的this;这两个方法第一个参数,就是希望得到的this

比如上面的foo函数,由于定义在全局环境中,this默认指向window;如果想更改里面指向的this,例如改成man,可以调用foocall()方法,然后把man传进来:

foo.call(man); // 输出`man`

foo.apply(man); // 也是输出`man`

两个方法都可以更改函数执行时绑定的this;那它们有什么不同呢?主要是在传参上。

假如foo定义时包括了形参:

window.name = 'Tommy'

function foo(a, b) {

    console.log(a + b + this.name);

}

也就是说foo调用时期望传进两个参数,所以对于foo.call()foo.apply()的形式,第一个参数指定绑定的this,后面的参数指定foo调用时期望传入的参数(有2个);对于call来说,两个参数一个一个传进来;而对于apply来说,两个参数必须组成一个数组,以数组方式传进来:

foo.call(man, 'Hello, ', 'Mr.'); // 输出‘Hello, Mr.Jason’

foo.apply(man, ['Hello, ', 'Mr.']); // 同样输出‘Hello, Mr.Jason’

比较下直接调用foo的结果

foo('Hello, ', 'Mr.'); 输出‘Hello, Mr.Tommy’
posted @ 2018-05-11 23:37  叙帝利  阅读(1578)  评论(0编辑  收藏  举报