摘要:作為一個菜雞的我而言,在之前講到過那么多的鏈式查找機制,比如說原型鏈,作用域鏈等等,想當然的把這個機制帶入到了指向上邊,結果就是這個指向指的我萬臉懵逼標題換字了,擔心被河蟹在經過漫長的通俗易懂的規范閱讀之后,分享一下我所認知的指向簡而言之,
作為一個js菜雞的我而言,在之前講到過那么多的js鏈式查找機制,比如說原型鏈,作用域鏈等等,想當然的把這個機制帶入到了this指向上邊,結果就是這個this指向指的我萬臉懵逼(標題換字了,擔心被河蟹),在經過漫長的通(gou)俗(pi)易(bu)懂(tong)的 ECMAScript規范閱讀之后,分享一下我所認知的this指向常見的幾種調用方式簡而言之,js中this的指向不是在函數定義的時候確定的,而是在調用的時候創建階段確定的,也就是說this指向誰,完全取決于函數的調用方式
直接調用, 比如說
function a() {
console.log(this);
}
a();
這個例子里邊this指向的是全局對象,在客戶端的全局對象是window對象,在node 中的全局對象是global對象
(function a() { function b() { console.log(this); } b() })()
直接調用指的是直接用函數名稱后邊加()執行調用的函數,無論是否在全局作用域
間接調用
const obj ={
name:"obj對象", a(){ console.log(this) }
}
obj.a()
如圖
在圖中我們可以看到我們在對象里邊調用對象里邊的方法的時候,this指向的是obj對象,
或者說外邊有一個函數 然后給一個obj對象的屬性賦值
const obj ={ name:"obj對象", a(){ console.log(this) } } obj.a() obj.b=function(){ console.log(this,"b") } obj.b()
打印的結果都是obj對象
new調用
當我們他用過new 創建一個新的對象的時候,new會調用這個構造函數來創建一個對象,那么這個對象里邊的this是這個被new的函數調用的,那么自然 new調用的時候,this就是指向這個新對象的
function A(data) { this.data = data; } class B{ constructor(data){ this.data = data } } let a = new A("A"); let b = new B("B"); console.log(a.data); console.log(b.data);
如圖
這個new,在創建對象的時候做了什么,我們會在下一篇博客里邊仔細說明
箭頭函數中的this
箭頭函數可以理解成是是一個語法糖,他沒有自己的this綁定,箭頭函數中使用的this是包含他的那個函數的this
比如說
const obj = { a() { return () => { console.log(this); }; } }
上邊這段代碼被轉譯成es5 的時候如下
const obj = { a: function a() { var _this = this; return function () { console.log(_this); }; } };
綜合以上所有的代碼,得出一個結論就是,在js中this的綁定正常來講是指向調用這個方法的對象來確定的,當然還有一些不正常的方法,可以改變this的指向
注意 ,下邊介紹的幾種方法,不能改變箭頭函數的this指向,箭頭函數本身是沒有this綁定的,在介紹完不正常的情況后,再來說一說那些能夠改變this指向的方法ECMAScript 5.1 規范的this指向
js中this的綁定正常來講是指向調用這個方法的對象來確定的
這句話在理論上是這么講,在工作中正常的調用的話,這個理論是沒有毛病的,在 ECMAScript 5.1 的規范里邊規定,在js里邊分為語言類型和規范類型
語言類型
ECMAScript 里邊的語言類型規定的是我們可以直接操作的一些類型,比如string number,object等等這些
規范類型
規范類型ECMAScript 里邊指的是一種抽象的規范,他們并不是讓我們用來進行操作的,二是用來描述一些行為或者邏輯的,比如說typeof delete等等
ECMAScript 5.1 里邊的this規定大概講就是這樣的,每個對象里邊有一個Reference 規范類型,this會根據Reference這個規范類型進行賦值
ECMAScript 5.1
規范奉上 Reference 這個東西大家簡單的理解成是()前邊的那一塊就好了,上邊我們講的那些正常的就是說左邊是
函數定義表達式
屬性訪問表達式
對象創建表達式
屬性創建表達式
這幾種情況,在這幾種情況的時候上邊那句話是成立的
但是如果不是這上邊的那幾句話的時候,比如說括號里邊是一個和函數相關計算或者一個運算符等等
這個時候this會指向undefined ,這個時候在非嚴格模式的情況下會被隱式轉換成window對象
var value = 1; var obj = { value: 2, a() { return this.value; } } console.log(obj.a()); console.log((obj.a)()); console.log((obj.a = obj.a)()); console.log((false || obj.a)()); console.log((obj.a, obj.a)());
記得之前看到過這個一個例子,運行結果如圖
時間關系就說這些,下一篇博客會說new在運行時候過程和改變this指向的一些方法,
以上是我對this指向的一些認識,有不足的地方希望之處
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105503.html
摘要:無關緊要的開頭作為一個年輕的前端從業者,近期趾高氣昂的去各種面試,抱著找虐心態去單挑的結果就是被各種面試題晃斷腳踝并被射,然后開始質問自己對的掌握為何如此淺薄,為何當初不好好學世界上最好的語言。 /*===無關緊要的開頭start===*/作為一個年輕的前端從業者,近期趾高氣昂的去各種面試,抱著找虐心態去單挑的結果就是被各種面試題晃斷腳踝并被yan射,然后開始質問自己對js的掌握為何如...
摘要:值得注意的是,如果值在前面也就是值小于值,那么值域會被認為是零長度,而不是負增長。 underscore.js源碼加注釋一共1500多行,它提供了一整套函數式編程實用的功能,一共一百多個函數,幾乎每一個函數都可以作為參考典范。初讀的時候,真是一臉懵圈,各種函數閉包、迭代和嵌套的使用,讓我一時很難消化。在這里,我來記錄一下我學習underscore.js的一些發現,以及幾個我認為比較經典...
摘要:那默認綁定到哪呢,一般是上,嚴格模式下是。這種情況下,函數里的默認綁定為上下文對象,等價于打印故輸出。只接受兩個參數,且第二個參數必須是數組,這個數組代表原函數的參數列表。即繼承原函數的原型將這個新對象綁定到此函數的上。 js 的 this 綁定問題,讓多數新手懵逼,部分老手覺得惡心,這是因為this的綁定 ‘難以捉摸’,出錯的時候還往往不知道為什么,相當反邏輯。讓我們考慮下面代碼: ...
摘要:那默認綁定到哪呢,一般是上,嚴格模式下是。這種情況下,函數里的默認綁定為上下文對象,等價于打印故輸出。只接受兩個參數,且第二個參數必須是數組,這個數組代表原函數的參數列表。即繼承原函數的原型將這個新對象綁定到此函數的上。 js 的 this 綁定問題,讓多數新手懵逼,部分老手覺得惡心,這是因為this的綁定 ‘難以捉摸’,出錯的時候還往往不知道為什么,相當反邏輯。讓我們考慮下面代碼: ...
閱讀 2337·2021-11-16 11:52
閱讀 2322·2021-11-11 16:55
閱讀 750·2021-09-02 15:41
閱讀 2981·2019-08-30 15:54
閱讀 3142·2019-08-30 15:54
閱讀 2251·2019-08-29 15:39
閱讀 1507·2019-08-29 15:18
閱讀 968·2019-08-29 13:00