一.每个函数都有两个非继承而来的方法,call()方法和apply()方法;
二.作用:这两个方法的作用是一样的,都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域。
一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向。
1:有关call()方法
语法:call(thisObj,arg1,arg2,...,argN);
参数:thisObj,可选项,将被用作当前对象的对象(即this的指向),若该选项没写,则指向全局对象;
参数:arg1,arg2,...,argNj,可选项,这些是要调用的方法的参数
//例子1:对于thisObj的应用 window.color = "aaa"; document.color = "bbb"; var say = { color: "ccc" }; function changeColor () { console.log(this.color); } changeColor(); //aaa (这里默认的this指针指向了全局对象window) changeColor.call(window); //aaa (这里将this指针指向了window) changeColor.call(document); //bbb (这里将this指针指向了document) changeColor.call(say); //ccc (这里将this指针指向了say)
//例子2:对于参数thisObj和argN的应用 var getWord = { words : "周一", speak : function (name) { console.log(name + "!" +this.words); } }; getWord.speak("今天"); //今天!周一 var otherWord = { words : "周二" }; getWord.speak.call(otherWord,"明天"); //明天!周二
2:有关apply()方法
语法:apply([thisObj [,argArray] ]);
接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。
说明:如果argArray不是一个有效数组或不是arguments对象,那么将导致一个 TypeError;
如果没有提供argArray和thisObj任何一个参数,那么Global对象将用作thisObj。
//例子1: window.color = "aaa"; document.color = "bbb"; var say = { color: "ccc" }; function changeColor () { console.log(this.color); } changeColor(); //aaa (这里默认的this指针指向了全局对象window) changeColor.apply(window); //aaa (这里将this指针指向了window) changeColor.apply(document); //bbb (这里将this指针指向了document) changeColor.apply(say);