JavaScript--this的指向及call、apply的區別

判斷函數中this的指向

我們在使用函數時,常常用到this,判斷不同場景下this的指向是非常重要的。在此做一個總結,方便大家學習。

函數的使用場景,基本包含如下幾種場景。

  • 普通函數中的this-------window
  • 對象,方法中this------當前實例對象
  • 定時器函數中的this----window
  • 構造函數中的this------實例對象
  • 原型對象方法中的this-----實例對象

這個結果的分析其實非常簡單,函數要想執行一定需要對象來調用(普通函數也一樣)。

普通方法和定時器中的方法,看似沒有對象來調用,他們都默認是window的方法,大家也知道在使用時,window又可以省略。

其餘幾種情況,不管是在對象的創建過程中,還是在對象中。這些方法最終都需要對象去調用,所以這些方法中的this都是指所在或者創建的對象。

call()、apply()的作用及區別

上邊我們已經分析過函數中this的指向,也就是函數在執行時this代表的是誰。而call和apply的作用就是改變函數執行過程中this的指向,他們兩個的作用完全一樣,只是在使用方式上稍有差別。

以普通方法爲例來分析call()的作用:

                        var name = "小明";
			function text(){
				console.log(this.name);
			}
			text();//小明

根據上邊的分析,我們知道普通方法在執行時,默認爲window在調用,那麼在方法中this就是window。

this.name===window.name,所以輸出的小明。

                        var name = "小明";
			function text(){
				console.log(this.name);
			}
			text();//小明
			var person = {
				name:"小紅"
			}
			text.call(person);//小紅

當要執行text方法時,我們使用了text.call(person)的方式,這時函數還是正常執行,只是此時函數中的this不管原來是誰,都變成了person,所以輸出this.name就是輸出person.name;

call()和apply()的區別:

函數有帶參函數,call和apply的差別就是在傳入參數時的方式不同。call是一個一個的傳,而apply是將參數以數組爲單位傳入函數。還是上邊的例子,我們把它改爲帶參函數。

                        var name = "小明";
			function text(age){
				console.log(this.name);
				console.log(age)
			}
			text(18);//小明 18
			var person = {
				name:"小紅"
			}
			text.call(person,18);//小紅 18
                        var name = "小明";
			function text(age){
				console.log(this.name);
				console.log(age)
			}
			text(18);//小明 18
			var person = {
				name:"小紅"
			}
			text.apply(person,[18]);//小紅 18

這就是call 和apply的區別,只是在傳參方式不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章