【JS】JS中對於this的理解


一、對this的產生原因分析和了解

第一:this指的是函數運行時所在的環境(即調用的對象)。
第二:JavaScript 語言之所以有this的設計,跟內存里面的數據結構有關系(內存存儲詳細理解參考原文)。

總結如下:

對於普通對象的保存:實際對象屬性的值就是值;
對於函數的保存:實際函數屬性的值是函數的地址;(而函數本身,可理解為:它不屬於任何一個對象,相當於一個全局對象。所以,函數在不同場景下運行,this就是不同的場景了,不過都是執行時的環境)
同時,函數,可以作為一個參數(值)被調用,被傳播。同時,在函數體內部,允許引用當前環境的其他變量(可以引用當前環境的其他變量。但當前環境是不確定的,所以會出現不同的值)

二、this綁定詳解

this 實際上是在函數被調用時發生的綁定,它指向什么地方完全取決於函數在哪里被調用。

2.1 默認綁定(綁定在全局作用域)

即在調用函數時,函數不帶任何修飾,也就是“光禿禿”的調用(即沒有任何修飾的調用),就會應用默認綁定規則, 默認綁定指向全局作用域。

注意:在 javascript 中,如果使用了嚴格模式,則 this 不能綁定到全局對象。(不是很理解,不過先記錄下)

2.2 隱式綁定

當函數在調用時,如果函數有所謂的“落腳點”,即有上下文對象(即調用時.前面的對象)時,隱式綁定規則會把函數中的 this 綁定到這個上下文對象。

function say() {
    console.log(this.name)
}
var name = "global"
var obj = {
    name: "inside",
    say: say
}
var alias = obj.say // 設置一個簡寫   (1)
alias() // 函數調用 輸出"global"  (2)

注意:隱式綁定時丟失上下文問題。
這個可以結合函數的存儲理解為:obj.say只是一個函數地址,不是函數本身。所以調用時,還是在當前全局環境下調用。

2.3 顯式綁定:apply,call,bind

javascript中提供三種顯式綁定方法:apply,call,bind

apply call bind
相同點 applycall的用法基本相似 applycall的用法基本相似
不同點 apply(obj,[arg1,arg2,arg3,...]被調用函數的參數以數組的形式給出 call(obj,arg1,arg2,arg3,...)被調用函數的參數依次給出
作用 apply, call 的作用就是給函數綁定一個執行上下文,且是顯式綁定的。但傳入參數時會有所不同。 同左

注意:bind返回一個新函數,這個函數已經制定了執行上下文(這表示執行上下文在之后不可改變了),而返回這個新函數可以接受參數(即在綁定的執行上下文中,以參數為入參執行函數)。

2.4 new 綁定

new 綁定:指通過 new 操作符調用構造函數時發生的 this 綁定。

注意:在 javascript 中並沒有其他語言那樣的類的概念。構造函數也僅僅是普通的函數而已,只不過構造函數的函數名以大寫字母開頭,也只不過它可以通過 new 操作符調用而已。

實際上:new 和 bind 應該很類似。只是一個在創建時執行,一個在執行過程中執行。(不過還是很不同的,見下文區別)

2.5 bind 和 new 的區別

不過還是有區別的:bind只能被函數調用。而new 返回的是一個對象。即new 之后,函數的執行上下文就不可以被改變了,bind不行,顯示綁定的三種形式都不行。所以new 綁定 的優先級最高。

2.6 四種綁定的優先級和區別:

默認綁定 < 隱式綁定 < 顯式綁定 < new 綁定

注意:bind只能被函數調用。而new 返回的是一個對象。即new 之后,函數的執行上下文就不可以被改變了,bind不行,顯示綁定的三種形式都不行。所以new 綁定 的優先級最高。

三、當 this 碰到 return :

注:主要參考:https://www.cnblogs.com/pssp/p/5216085.html

具體代碼見原文,主要總結就是:
如果返回值是一個對象,那么 this 指向的就是那個返回的對象,如果返回值不是一個對象那么 this 還是指向函數的實例。(null是特例,雖然null是對象,但是返回時指向的還是函數的實例。)
即:函數返回對象時,那么this指向的是這個返回對象的運行環境;
函數返回不是對象時,那么this指向的就是這個函數本身。

四、參考

  1. JavaScript 的 this 原理 - 阮一峰的網絡日志 http://www.ruanyifeng.com/blog/2018/06/javascript-this.html
  2. JavaScript中this綁定詳解 - 想到什么寫什么 - SegmentFault 思否 https://segmentfault.com/a/1190000007101339
  3. 徹底理解 js 中 this 的指向,不必硬背。 - 追夢子 - 博客園 https://www.cnblogs.com/pssp/p/5216085.html
    注:另一篇比較詳細的說明,和上面幾篇的模式不同,不過講解的也很清楚


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM