javascript是面向对象的语言,Function也是一种对象,有自己的属性和方法。call和apply就是js函数自带方法,挂在Fucntion.prototype上。
一般调用某函数时,直接“函数名(参数)”的写法即可,函数内部的this指向函数的调用者。
- function add(a,b){
- console.log(this);
- return a+b;
- }
- add(1,2) // 默认window调用,this指向window
-
- var math = {
- add:function(a,b){
- console.log(this);
- return a+b;
- }
- }
- math.add(1,2) // this指向math
call和apply的作用是给函数重新指定调用者,指定this的指向:
- var name = "WINDOW";
- var someone = {
- name: "yource"
- };
-
- /** 一般写法 **/
- function greet1(person) {
- var reply = "Hello, " + person.name;
- console.log(reply)
- }
-
- greet1(someone); // Hello, yource
-
- /** 使用call/apply **/
- function greet2() {
- var reply = "Hello, " + this.name;
- console.log(reply)
- }
-
- greet2(); // Hello, WINDOW
- greet2.call(someone); // Hello, yource
- greet2.apply(someone); // Hello, yource
call和apply的不同之处仅在于提供参数的方式:call使用一组参数列表,apply使用参数数组。
- /*apply()方法*/
- function.apply(thisObj[, argArray])
-
- /*call()方法*/
- function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);
apply最多只能有两个参数:调用者thisObj和一个数组argArray。call可以接受多个参数,第一个参数与apply一样,后面则是一串参数列表。