JavaScript 的this
關鍵字你們都不陌生,根據this
所在的不一樣的運行環境,會產生一些容易讓人困惑的表現和差別,在沒有仔細瞭解this
以前,我對它的理解很是的生硬和片面,但願你們閱讀完這篇內容可以清楚的明白this
的用途。
讓咱們看一下這個栗子:javascript
var name = 'MyWindow' function SayHi() { console.log('Hi, My name is ' + name + '.') } var MyJavaScript = { name: 'MyJavaScript', sayHi: SayHi, } SayHi() // Hi, My name is MyWindow. MyJavaScript.sayHi() // Hi, My name is MyWindow.
能夠看到,當咱們想試圖輸出Hi, My name is MyJavaScript.
的時候,仍是輸出了window
。由於SayHi
函數裏輸出的name
變量值一定是沿着當前執行環境的做用域鏈查找的,而SayHi
函數被調用時會建立出一個本身的執行環境,按照做用域嵌套順序,SayHi
被嵌套在全局執行環境中,在函數內部查找name
變量則會找到外層的全局做用域中的name
變量,因此不論如何調用都會輸出window
。java
那想想,當咱們調用MyJavaScript.sayHi()
時要如何準確輸出MyJavaScript
對象的name
屬性呢?數組
噔噔蹬蹬,this
機制就此誕生了!!(自帶 bgm)瀏覽器
this
被用來指向
函數真正的運行環境。
讓咱們改寫一下SayHi
方法:app
var name = 'MyWindow' function SayHi() { // 此處發生變化 console.log('Hi, My name is ' + this.name + '.') } var MyJavaScript = { name: 'MyJavaScript', sayHi: SayHi, } SayHi() // Hi, My name is MyWindow. MyJavaScript.sayHi() // Hi, My name is MyJavaScript.
如上圖,當咱們將name
修改成this.name
後,sayHi
函數當在做爲MyJavaScript
對象的某一屬性被調用時,準確的輸出了當前函數的調用者MyJavaScript
對象的name
屬性值。函數
由此咱們能夠得知,this
對象的做用就是當函數在不一樣的執行環境下被調用,讓咱們可以獲得真正調用函數的對象。與函數定義在哪裏或者函數做用域無關,只關心函數的調用方式。this
========================= 僞裝華麗的分割線 ===========================spa
以上就是this
對象的前世,下面會整理一些與this
對象相關的必懂知識點,供你們查閱。3d
this
是JavaScript
關鍵字,在非嚴格模式下,它老是指向一個對象,而具體指向哪一個對象是根據函數運行時所在的執行環境動態綁定的。code
由於函數能夠在不一樣的運行環境中執行,自身調用或做爲方法調用,爲了獲得當前函數真正運行時的所在執行環境,即函數執行時真正的調用對象,this
機制就此誕生了。
(同上)指向函數真正的調用對象。
全局環境下this
默認指向全局對象,嚴格模式下則爲undefined
,瀏覽器中則爲window
對象。
e.g. func()
=> this
默認指向全局對象 => window
(瀏覽器下)。
this
指向由調用方式決定,在函數執行時肯定。
e.g. obj.func()
=> this
指向具體調用對象 => obj
。
這裏能夠理解爲obj.f1()
咱們是經過該對象obj
找到f1
函數的,則它運行時所在環境就是obj
環境,this
指向obj
。
當一個函數用做構造函數時(使用 new 關鍵字),它的this
被綁定到正在構造的新對象。
this
指向取決於函數返回的對象(默認無初始化值 => undefined
),在類上下文中則是取決於類的構造函數返回對象(默認返回類中定義的全部屬性和方法,不包括靜態方法)。
無初始化值
手動添加 this 屬性
是否是想返回了??快結束了啊,再堅持一下 👋
咱們知道普通函數的this
指向在函數執行時肯定,由函數的調用方式決定。
而在 ES6 的箭頭函數中,this
指向在函數定義時就肯定了,永遠指向該函數聲明時所在的環境對象,任何其餘方式都沒法修改this
的指向。
由於this
對象表明調用這個函數的對象,而靜態方法是屬於類的而不是調用對象,靜態方法成功加載後,調用對象可能還不存在。所以在靜態方法中是找不到this
對象的值的。
匿名函數中this
的指向也是依舊由函數調用方式決定。
foo
做爲objA
的方法被調用,this
指向objA
。
foo
被指向objA.foo
所指向的匿名函數,當foo
被簡單調用時,this
就指向了全局對象。
當使用setTimeout
和setInterval
時,回調函數中的this
默認指向window
對象,由於setTimeout
和setInterval
是window
對象提供的方法。
可見,setTimeout
中輸出的是window
對象上的count
屬性。
真的真的第 99 步了,堅持到底啊 👋
call
的參數是直接放進去的,第二第三第 n 個參數全都用逗號分隔。
apply
的第二個參數接收的是一個數組,對應傳遞給被綁定的函數。
bind
用法和call
一致,可是bind
返回的是被綁定的函數,須要作一次額外的手動調用。
到此本文就結束啦,能堅持看完的小夥伴們必成大才!感謝閱讀,歡迎點贊 🇨🇳