討論js里 this的指向情況

在JavaScript中,this是當前執行函數的環境。因為JavaScript有4種不同的函數調用方式:

函數調用: alert('Hello World!')

方法調用: console.log('Hello World!')

構造函數調用: new RegExp('\d')

隱式調用: alert.call(undefined, 'Hello World!')

并且每種方法都定義了自己的上下文,this會表現得跟我們預期的不太一樣。同時,strict模式也會影響函數執行時的上下文。

理解this的關鍵點就是要對函數調用以及它所處的環境有個清晰的觀點。這篇文章將會著重于對函數調用的解釋、函數調用如何影響this以及展示確定環境時常見的陷阱。



下面列舉一些this常用的場景,希望可以對讀者有所幫助:

一、普通函數里的this指向:普通函數中的this指針指向于調用者;

this 在函數調用中是一個全局對象,全局對象是由執行的環境決定的。在瀏覽器里它是window對象。

function fn (){

??? this.name = '小璇';

??? console.log(this);?? // 此處打印window

? ? console.log(this.name);? // 此處打印小璇

}

fn();

二、在定時器中的this的指向:

function CreatePerson () {

?????? this.name = '小璇';

?????? setInterval(function(){

? ? ? ?? console.log(this);

?}, 2000) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // ? this指向與構造函數創建的對象:this的調用者是new


????? // setInterval(this.show, 2000); ? ? //? 由new來給定時器綁定一個函數


????? // setInterval(function(){ ? ? ? ? ?? ?? // this指向于window;因為this是由定時器調起執行的

????? //? ? console.log(this);

????? // }, 2000);???????????????????????????????? //把this的指向固定在self變量中


var slef = this;

????? setInterval(function(){???????????????? // 此時,self指向的是對象

????????? self.show();

????? }, 2000);

}

CreatePerson.prototype.show = function (){

// console.log('hello');

console.log(this);

}

三、在對象方法中的this指針指向:

var name = '小李子';

var per = {

????? name: '小璇',

????? fn: function () {

???? ? ? ?? console.log(this.name);

?????? }

}

per.fn();?????????????? //this指針指向了per

var obj = per.fn;??

window.obj();? ? ? ? // fn方法交給了window對象調用,所以方法中的this指針指向了window對象

四、在構造函數中的調用:

function CreatePerson() {

this.name = '小璇';

// 如果在構造函數中向外返回一個對象,則該對象會覆蓋由new創建出來的對象

// return {

//? ? name: '小李子'

// }

// 構造函數不能向外返回引用類型,因為返回的引用類型會替換掉new創建出來的對象

// 如果向外返回的是null對象,則不會替換

return null;

}

// 因為new調用函數執行時:1、開辟一塊內存空間;2、把函數中this的指向指為這塊空間;3、把創建出來的空間交給變量

var per = new? CreatePerson();

console.log(per.name);

五、在事件函數中的this的指向:

function Btn() {

????? this.b = 23;???? 這里的this指向調用者new

????? var _this = this;? //凝固指針

????? document.getElementById('btn').onclick = function (){

????? // this.show();

????? _this.show();?? //這里的指針依舊是new,而不是點擊事件的標簽

????? };

}

window.onload = function () {

????? new Btn();

}

六、事件函數中this的指向

var btn = document.querySelector('#btn');

btn.onclick = function () {

console.log(this);

// 如果事件函數中嵌套了函數,該函數又出現了this指針,則該指針指向window對象

?? hello()??? // 此時下方被調用的hello函數里的this指向window

// hello.call(this);??? //此時下方被調用的hello函數里this指向點擊事件的標簽,使用call扭轉this的指向到當前作用域的this;

}

function hello() {

this.style.backgroundColor = 'red';

}

結論:

因為函數調用對this有最大的影響,從現在起,不要再問你自己:

this是從哪里來的?

而要問自己:函數是怎么被調用的

對于有指向的函數,問問你自己:

在這個有指向的函數被定義的環境,this是什么?

這是處理this時的正確想法,它們可以讓你免于頭痛。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 葡萄藤PPT JS中this的指向 大家好,我是IT修真院鄭州分院第6期的學員王棟,一枚正直、純潔、善良的前端程序...
    17064閱讀 633評論 0 2
  • 工廠模式類似于現實生活中的工廠可以產生大量相似的商品,去做同樣的事情,實現同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,842評論 2 17
  • 單例模式 適用場景:可能會在場景中使用到對象,但只有一個實例,加載時并不主動創建,需要時才創建 最常見的單例模式,...
    Obeing閱讀 2,103評論 1 10
  • 首先必須要說的是,this的指向在函數定義的時候是確定不了的,只有函數執行的時候才能確定this到底指向誰,實際上...
    Mr__王閱讀 738評論 0 3
  • 沒搞錯吧!js寫了那么多年,this還是會搞錯!沒搞錯,javascript就是回搞錯! ………… 在寫java的...
    zhoulujun閱讀 1,458評論 0 11