this的五种指法
this 到底指向哪里
以下如果沒(méi)提及,則為嚴(yán)格模式。js中作用域有兩種:
詞法作用域
詞法作用域指在書寫代碼時(shí)就被確定的作用域。
看如下代碼
動(dòng)態(tài)作用域
動(dòng)態(tài)作用域指在代碼運(yùn)行時(shí)才被確定的作用域。
js中只有this的作用域是動(dòng)態(tài)作用域
this的五種綁定
初學(xué)js時(shí),會(huì)想當(dāng)然認(rèn)為this遵循某一條規(guī)律,就像物理學(xué)那樣,然而并不是。
this的綁定分為五種情況,這五種情況之間毫無(wú)規(guī)律可言。不過(guò)好在都很簡(jiǎn)單。
一. 默認(rèn)綁定
當(dāng)以如下形式執(zhí)行一個(gè)函數(shù)時(shí),this為默認(rèn)綁定;
func()- 嚴(yán)格模式下,this為undefined
- 非嚴(yán)格模式下,this是全局對(duì)象。
與函數(shù)調(diào)用嵌套多少層如何嵌套無(wú)關(guān)
/* 全是undefined */ function printThis(){return this } var obj = {say(){console.log('obj.say',printThis())} } function funcB(){console.log('funcB',printThis());obj.say(); } console.log('funcA',printThis()) obj.say() funcB()二. 隱式綁定
當(dāng)以如下行駛執(zhí)行一個(gè)函數(shù)時(shí),this為隱式綁定;
a.b.func()此時(shí)this指向點(diǎn)前面一個(gè)對(duì)象
賦值會(huì)改變隱式綁定this的指向
- 方法賦值給變量
- 函數(shù)被賦值成方法
- 賦值給參數(shù)
極為常見的是回調(diào)函數(shù)的this是undefined,因?yàn)榛卣{(diào)函數(shù)被復(fù)制給參數(shù),參數(shù)再調(diào)用時(shí)變成了默認(rèn)綁定
function asyncFun(cb){cb() } var obj = {callback(){console.log(this)} } obj.callback()/*隱式綁定 obj */ asyncFun(obj.callback);/*默認(rèn)綁定 undefined */三. 箭頭函數(shù)
箭頭函數(shù)會(huì)讓this指向最近的函數(shù)或全局作用域
- 與最近的函數(shù)的this指向相同
- 指向全局
- 指向?qū)嵗?/li>
四. 顯示綁定
call, apply, bind指定this指向
五. new綁定
構(gòu)造函數(shù),ES6中的classnew構(gòu)造函數(shù),new class時(shí),this指向?qū)嵗?
總結(jié)
總結(jié)
- 上一篇: web页面版权部分的显示问题
- 下一篇: Spring @Bean and @Co