再次談?wù)揓avascript中的this
一直對Javascript中的this都有一種似是而非的感覺,今天突然感覺豁然開朗,特此記錄一下。
咱們先看個栗子:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>this的使用</title> <script type="text/javascript"> var Car,tesla; Car=function () { this.start=function(){ console.log('car started'); }; this.turnKye=function () { var carKey=document.getElementById('car_key'); carKey.onclick=function () { this.start(); }; } return this; } tesla=new Car(); tesla.turnKye(); </script> </head> <body> <input type="button" id="car_key" value="test" /> </body> </html>
咋一看這段代碼沒有什么問題,但是由于對于this的錯誤理解最終導(dǎo)致錯誤的結(jié)果。我們在元素car_key上面綁定了click事件,認(rèn)為在car的類中嵌套綁定click事件就可以讓這個dom元素訪問car的this上下文。這種方式看起來很合理,但是不幸的是它并不工作。
在Javascript中,this關(guān)鍵字總是指向正執(zhí)行的作用域的所有者。
請大家仔細(xì)揣摩上面那句話。正如我們所知,函數(shù)調(diào)用會產(chǎn)生新的作用域,一點onclick事件被觸發(fā),this就指向了dom元素而不是Car的類。
那我們怎么做才會讓它能正常工作呢?我們通常會把this賦值給一個局部的自由變量(比如that,_this,self,me等,這個在許多的框架里面都有體現(xiàn))來避開作用域帶來的問題。這里使用局部變量來重寫之前的方法:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>this的使用</title> </head> <body> <input type="button" id="car_key" value="test" /> <script type="text/javascript"> var Car,tesla; Car=function () { this.start=function(){ console.log('car started'); }; this.turnKye=function () { var that=this; var carKey=document.getElementById('car_key'); carKey.onclick=function () { that.start(); }; } return this; } tesla=new Car(); tesla.turnKye(); </script> </body> </html>
由于that是一個自由變量,onclick事件的出發(fā)并不會引起它的重新定義。
如果你熟悉ES6的話可以使用胖箭頭符號,這更簡潔和更容易理解,如下:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>this的使用</title> </head> <body> <input type="button" id="car_key" value="test" /> <script type="text/javascript"> var Car,tesla; Car=function () { this.start=function(){ console.log('car started'); }; this.turnKye=function () { //var that=this; var carKey=document.getElementById('car_key'); //carKey.onclick=function () { // that.start(); //}; carKey.onclick=()=>this.start(); } return this; } tesla=new Car(); tesla.turnKye(); </script> </body> </html>
當(dāng)然我們也可以使用綁定函數(shù)的方法來解決這個問題:如下
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>this的使用</title> </head> <body> <input type="button" id="car_key" value="test" /> <script type="text/javascript"> var Car,tesla; Car=function () { this.start=function(){ console.log('car started'); }; var click=function(){ this.start(); } this.turnKye=function () { //var that=this; var carKey=document.getElementById('car_key'); carKey.onclick=click.bind(this); } return this; } tesla=new Car(); tesla.turnKye(); </script> </body> </html>
其實這些在學(xué)習(xí)React的時候,綁定事件的時候遇到的坑,那時候只知道這么寫,不知道怎么回事,今天突然感覺豁然開朗。希望對大家有所幫助。
- 實例淺析js的this
- Javascript中this綁定的3種方法與比較
- JavaScript中this的四個綁定規(guī)則總結(jié)
- 幾句話帶你理解JS中的this、閉包、原型鏈
- javascript this詳細(xì)介紹
- 學(xué)習(xí)掌握J(rèn)avaScript中this的使用技巧
- JavaScript中的this使用詳解
- 老生常談 js中this的指向
- JavaScript的this關(guān)鍵字的理解
- 聊一聊JS中this的指向問題
- JS中改變this指向的方法(call和apply、bind)
- JavaScript中的this,call,apply使用及區(qū)別詳解
- 探索Javascript中this的奧秘
相關(guān)文章
鼠標(biāo)滑過出現(xiàn)預(yù)覽的大圖提示效果
這篇文章主要介紹了如何實現(xiàn)鼠標(biāo)滑過出現(xiàn)預(yù)覽的大圖提示效果,需要的朋友可以參考下2014-02-02JavaScript基于對象方法實現(xiàn)數(shù)組去重及排序操作示例
這篇文章主要介紹了JavaScript基于對象方法實現(xiàn)數(shù)組去重及排序操作,涉及javascript基于對象方法的數(shù)組遍歷、比較、去重、排序等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07在線編輯器的實現(xiàn)原理(兼容IE和FireFox)
在線編輯器的實現(xiàn)原理(兼容IE和FireFox)...2007-03-03ES6 新增的創(chuàng)建數(shù)組的方法(小結(jié))
這篇文章主要介紹了ES6 新增的創(chuàng)建數(shù)組的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08js下拉選擇框與輸入框聯(lián)動實現(xiàn)添加選中值到輸入框的方法
這篇文章主要介紹了js下拉選擇框與輸入框聯(lián)動實現(xiàn)添加選中值到輸入框的方法,涉及javascript中onchange事件及頁面元素遍歷的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08JavaScript 正則表達(dá)式中g(shù)lobal模式的特性
這篇文章主要介紹了JavaScript 正則表達(dá)式中g(shù)lobal模式的特性 的相關(guān)資料,需要的朋友可以參考下2016-02-02JavaScript中常見的數(shù)據(jù)類型判斷方法小結(jié)
在?JS?編程中,正確判斷數(shù)據(jù)類型是必備技能,也是面試常問的內(nèi),本文將探討四種常用的數(shù)據(jù)類型判斷方法,通過了解它們的特點和適用范圍,能夠更好地處理不同數(shù)據(jù)類型的情況,避免出現(xiàn)錯誤和提升代碼質(zhì)量,需要的朋友可以參考下2023-06-06