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。

猜你喜欢

转载自www.cnblogs.com/aizz/p/9357481.html
今日推荐