call()和apply()
每个函数都包含apply和call方法。
相同点:都接收两个参数,一个是在其中运行函数的作用域,另一个是参数;
不同点:call方法和apply的不同之处在于接收参数的方式不同;
apply方法第二个参数可以是array的实例,也可以是arguments对象
1 function test(a,b) { 2 return a+b; 3 } 4 function test1(a,b) { 5 return test.apply(this,[a,b]); //因为在全局作用域内调用,所以this指向window,传入数组 6 } 7 function test2(a,b) { 8 return test.apply(this,arguments); //传入arguments对象,arguments包含传入函数的所有参数 9 } 10 console.log(test1(1,1)) //2 11 console.log(test2(1,1)) //2
call方法,传递给函数的参数必须逐个列举出来
1 function test3(a,b) { 2 return test.call(this,a,b); 3 } 4 console.log(test3(1,1)) //2
它们真正强大的地方是能够扩充函数运行的作用域,改变函数体内this的指向
1 window.name="is window"; 2 var obj={ 3 name:"is obj" 4 } 5 function app() { //定义一个全局函数 6 console.log(this.name); //this是指向window的 7 } 8 app(); //is window 9 app.call(this); //is window 10 app.call(window); //is window 11 app.call(obj); //is obj
直接调用函数打印出 is window,因为this是指向window的;app.call(this)和app.call(window)则显式地在全局作用域下调用函数的方式,也会打印出 is window;而app.call(obj),则改变了函数体内this的指向,将this指向了obj对象,所以打印出来is obj。