再次談?wù)揓avascript中的this
一直對(duì)Javascript中的this都有一種似是而非的感覺,今天突然感覺豁然開朗,特此記錄一下。
咱們先看個(gè)栗子:
<!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>
咋一看這段代碼沒有什么問題,但是由于對(duì)于this的錯(cuò)誤理解最終導(dǎo)致錯(cuò)誤的結(jié)果。我們?cè)谠豤ar_key上面綁定了click事件,認(rèn)為在car的類中嵌套綁定click事件就可以讓這個(gè)dom元素訪問car的this上下文。這種方式看起來很合理,但是不幸的是它并不工作。
在Javascript中,this關(guān)鍵字總是指向正執(zhí)行的作用域的所有者。
請(qǐng)大家仔細(xì)揣摩上面那句話。正如我們所知,函數(shù)調(diào)用會(huì)產(chǎn)生新的作用域,一點(diǎn)onclick事件被觸發(fā),this就指向了dom元素而不是Car的類。
那我們?cè)趺醋霾艜?huì)讓它能正常工作呢?我們通常會(huì)把this賦值給一個(gè)局部的自由變量(比如that,_this,self,me等,這個(gè)在許多的框架里面都有體現(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是一個(gè)自由變量,onclick事件的出發(fā)并不會(huì)引起它的重新定義。
如果你熟悉ES6的話可以使用胖箭頭符號(hào),這更簡(jiǎ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();
//};
carKey.onclick=()=>this.start();
}
return this;
}
tesla=new Car();
tesla.turnKye();
</script>
</body>
</html>
當(dāng)然我們也可以使用綁定函數(shù)的方法來解決這個(gè)問題:如下
<!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>
其實(shí)這些在學(xué)習(xí)React的時(shí)候,綁定事件的時(shí)候遇到的坑,那時(shí)候只知道這么寫,不知道怎么回事,今天突然感覺豁然開朗。希望對(duì)大家有所幫助。
- 實(shí)例淺析js的this
- Javascript中this綁定的3種方法與比較
- JavaScript中this的四個(gè)綁定規(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)文章
學(xué)習(xí)RxJS之JavaScript框架Cycle.js
這篇文章主要介紹了學(xué)習(xí)RxJS之JavaScript框架Cycle.js ,它是一個(gè)極簡(jiǎn)的JavaScript框架(核心部分加上注釋125行),提供了一種函數(shù)式,響應(yīng)式的人機(jī)交互接口,需要的朋友可以參考下2019-06-06
js中AppendChild與insertBefore的用法詳細(xì)解析
這篇文章主要是對(duì)js中AppendChild與insertBefore的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12
深入認(rèn)識(shí)JavaScript中的函數(shù)
深入認(rèn)識(shí)JavaScript中的函數(shù)...2007-01-01
動(dòng)態(tài)生成js類的實(shí)現(xiàn)方法
動(dòng)態(tài)生成js類的實(shí)現(xiàn)方法...2007-03-03
javascript實(shí)現(xiàn)多欄閉合展開式廣告位菜單效果實(shí)例
這篇文章主要介紹了javascript實(shí)現(xiàn)多欄閉合展開式廣告位菜單效果,可實(shí)現(xiàn)類似手風(fēng)琴切換展示效果的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
Js 利用正則表達(dá)式和replace函數(shù)獲取string中所有被匹配到的文本(推薦)
這篇文章主要介紹了Js 利用正則表達(dá)式和replace函數(shù)獲取string中所有被匹配到的文本,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-10-10
學(xué)習(xí)javascript的閉包,原型,和匿名函數(shù)之旅
Javascript中有幾個(gè)非常重要的語言特性——對(duì)象、原型繼承、閉包。其中閉包 對(duì)于那些使用傳統(tǒng)靜態(tài)語言C/C++的程序員來說是一個(gè)新的語言特性,本文給大家介紹js的閉包,原型,和匿名函數(shù)之旅,感興趣的朋友一起學(xué)習(xí)吧2015-10-10
JavaScript代碼實(shí)現(xiàn)簡(jiǎn)單日歷效果
這篇文章主要為大家詳細(xì)介紹了JavaScript代碼實(shí)現(xiàn)簡(jiǎn)單日歷效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04

