众所周知,每个函数都包含两个非继承而来的方法:apply()与call() 方法,他们都可以接收参数,他们的作用都是一样的,都是在特定的作用域里面调用函数,相当于设置函数体内的this对象的值,这也是他们的强大之处,就在于可以扩充函数运行的作用域,下面 就用代码来说明他们的作用,来看两个demo:
demo1:
window.name = "Jack";
var person = {
name:"Tom"
}
function who(){
console.log(this.name);
}
who(); //Jack
person.who = who;
person.who(); //Tom
demo2:
window.name = "Jack";
var person = {
name:"Tom"
}
function who(){
console.log(this.name);
}
who(); //Jack
who.call(this) //this指向全局 Jack
who.call(window) //Jack
who.call(person) //Tom
从两个demo对比来看 ,此时call(apply)的用法就是扩充作用域;
call与apply区别:
call与apply的唯一的不同点就是传参问题了,apply可以接受两个参数,第一个参数指向作用域对象(this),第二个参数可以接收参数数组,也可以是arguments对象;call方法,第一个参数相同,第二个参数后面明确接收每一个参数,例如call(this,person1,person2...)