摘要:默認(rèn)綁定最常用的函數(shù)調(diào)用類型獨(dú)立函數(shù)調(diào)用,這條規(guī)則可以看作無法應(yīng)用其他規(guī)則時(shí)的默認(rèn)規(guī)則非嚴(yán)格模式下如果是嚴(yán)格模式下會(huì)輸出在調(diào)用時(shí)沒有任何的修飾函數(shù),因此只能使用默認(rèn)綁定,指向全局變量作用域,被解析成全局變量隱式綁定示例代碼如上例所示,在對(duì)象
默認(rèn)綁定
最常用的函數(shù)調(diào)用類型:獨(dú)立函數(shù)調(diào)用,這條規(guī)則可以看作無法應(yīng)用其他規(guī)則時(shí)的默認(rèn)規(guī)則
function one() { console.log(this.a) } var a = 1 one() //1 非嚴(yán)格模式下 如果是嚴(yán)格模式下會(huì)輸出undefined
one在調(diào)用時(shí)沒有任何的修飾函數(shù),因此只能使用默認(rèn)綁定,this指向全局變量作用域,this.a被解析成全局變量a
隱式綁定示例代碼:
function one() { console.log(this.a) } var obj = { a : 1, one : one } obj.one() //1
如上例所示,在對(duì)象被調(diào)用時(shí),調(diào)用位置存在上下文對(duì)象,one被當(dāng)作引用屬性添加到obj中,當(dāng)one被調(diào)用時(shí),加上了對(duì)obj的引用,即此時(shí)函數(shù)引用有上下文對(duì)象,隱式綁定規(guī)則會(huì)把函數(shù)調(diào)用中的this綁定到這個(gè)上下文對(duì)象上,因此此時(shí)的this.a等同于obj.a
Tips:對(duì)象屬性引用鏈中只有上一層或者說最里面一層在調(diào)用位置中起作用,例子:
function one() { console.log(this.a) } var obj = { a : 1, one : one } var obj1 = { obj : obj, a : 2 } obj1.obj.one() //1隱式丟失
隱式綁定最常見的問題就是被隱式綁定的函數(shù)會(huì)丟失綁定的對(duì)象,即它會(huì)使用默認(rèn)綁定,將this綁定到全局對(duì)象上
function one() { console.log(this.a) } var obj = { a : 1, one : one } var another = obj.one var a = 2 another() //2
雖然another是obj.one的一個(gè)引用,但是實(shí)際上,它引用的是one函數(shù)本身,因此此時(shí)another()是一個(gè)不帶任何修飾的函數(shù)調(diào)用,會(huì)應(yīng)用默認(rèn)綁定
顯示綁定顯示綁定常見的綁定形式就是使用函數(shù)call()和apply()修改this的指向,它們的第一個(gè)參數(shù)就是一個(gè)對(duì)象,是給this準(zhǔn)備的,即在后面時(shí)this的指向域,示例代碼:
function one() { console.log(this.a) } var obj = { a : 1, } one.call(obj) //1硬綁定
有時(shí)顯示綁定不一定能解決我們碰到的問題,比如我們需要將this強(qiáng)制綁定到一個(gè)對(duì)象上,之后無論怎么調(diào)用都無法修改this指向,示例代碼:
function one() { console.log(this.a) } var obj = { a : 1, } var a = 2 var another = function () { one.call(obj) } another() //1 another.call(window) //1
硬綁定將one的this強(qiáng)制綁定在了obj上,無論之后如何調(diào)用函數(shù)another(),它總會(huì)手動(dòng)在obj上調(diào)用one
bind方法綁定示例代碼:
function one() { console.log(this.a) } var obj = { a : 1, } var another = one.bind(obj) another() //1
bind()會(huì)返回一個(gè)硬編碼的新函數(shù),它會(huì)把你指定的參數(shù)設(shè)置為this的上下文并調(diào)用原始函數(shù)
new綁定使用new來調(diào)用函數(shù)時(shí)需要注意的點(diǎn)
Tips:
創(chuàng)建(或者說構(gòu)造)一個(gè)全新的對(duì)象
這個(gè)對(duì)象會(huì)綁定到函數(shù)調(diào)用的this
如果函數(shù)沒有返回其他對(duì)象,那么new表達(dá)式中的函數(shù)調(diào)用會(huì)自動(dòng)返回這個(gè)新對(duì)象
示例代碼:
function one(a) { this.a = a } var another = new one(1) console.log(another.a)
使用new來調(diào)用one()時(shí),會(huì)構(gòu)造一個(gè)新對(duì)象并把它綁定到one()調(diào)用中的this上
判斷this綁定規(guī)則函數(shù)是否在new中調(diào)用(new綁定)?如果是的話this綁定的是新創(chuàng)建的對(duì)象
函數(shù)是否通過call、apply(顯示綁定)或者硬綁定調(diào)用?如果是的話,this綁定是指定的對(duì)象
函數(shù)是否在某個(gè)上下文對(duì)象中調(diào)用(隱式綁定)?如果是的話,this綁定的是那個(gè)上下文對(duì)象
如果都不是,使用默認(rèn)綁定,如果在嚴(yán)格模式下就綁定到undefined,否則綁定到全局對(duì)象
以上綁定規(guī)則優(yōu)先級(jí)由高到低,感興趣的可以自己去動(dòng)手驗(yàn)證一下
以上內(nèi)容是個(gè)人的一點(diǎn)總結(jié),如果有錯(cuò)誤或不嚴(yán)謹(jǐn)?shù)牡胤剑瑲g迎批評(píng)指正,如果喜歡,歡迎點(diǎn)贊收藏
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/88617.html
摘要:綁定最后要講的一種綁定規(guī)則,是指通過操作符調(diào)用構(gòu)造函數(shù)時(shí)發(fā)生的綁定。因此,所謂的綁定是指通過操作符來調(diào)用函數(shù)時(shí),會(huì)產(chǎn)生一個(gè)新對(duì)象,并且會(huì)把構(gòu)造函數(shù)內(nèi)的綁定到這個(gè)對(duì)象上。事實(shí)上,在中,使用來調(diào)用函數(shù),會(huì)自動(dòng)執(zhí)行下面的操作。 轉(zhuǎn)載請(qǐng)注明出處 https://segmentfault.com/a/11... this 可以說是 javascript 中最耐人尋味的一個(gè)特性,就像高中英語里各種...
摘要:綁定書中提到在中,實(shí)際上并不存在所謂的構(gòu)造函數(shù),只有對(duì)于函數(shù)的構(gòu)造調(diào)用。規(guī)則使用構(gòu)造調(diào)用的時(shí)候,會(huì)自動(dòng)綁定在期間創(chuàng)建的對(duì)象上。指向新創(chuàng)建的對(duì)象綁定比隱式綁定優(yōu)先級(jí)高。 showImg(http://ww1.sinaimg.cn/large/005Y4rCogy1fstcwvzkjzj30sg0g0qqn.jpg); 前言 最近正在看《你不知道的JavaScript》,里面關(guān)于this綁...
摘要:如下在第一個(gè)例子中,被點(diǎn)擊元素是通過,這個(gè)形式參數(shù)來代替的。它的作用和形式參數(shù)類似,其本質(zhì)上是一個(gè)對(duì)象的引用,它的特殊性在于不需要手動(dòng)傳值,所以使用起來會(huì)更加簡(jiǎn)單和方便。 無論在 javascript 的日常使用中還是前端面試過程中,this 的出鏡率都極高。這無疑說明了,this 的重要性。但是 this 非常靈活,導(dǎo)致很多人覺得 this 的行為難以理解。本文從為什么要有 this...
摘要:實(shí)際上并不存在什么構(gòu)造函數(shù),只存在對(duì)于函數(shù)的構(gòu)造調(diào)用發(fā)生構(gòu)造函數(shù)的調(diào)用時(shí),會(huì)自動(dòng)執(zhí)行下邊的操作創(chuàng)建一個(gè)全新的對(duì)象。說明綁定的優(yōu)先級(jí)高于硬綁定。 原文閱讀 ??js中的this是很容易讓人覺得困惑的地方,這篇文章打算說一下this綁定的幾種情況,相信可以解決大部分關(guān)于this的疑惑。 this是在運(yùn)行的時(shí)候綁定的,不是在編寫的時(shí)候綁定的,函數(shù)調(diào)用的方式不同,就可能使this所綁定的對(duì)象不...
摘要:的四種綁定規(guī)則的種綁定規(guī)則分別是默認(rèn)綁定隱式綁定顯示綁定綁定。綁定中的操作符,和其他語言中如的機(jī)制是不一樣的。規(guī)則例外在顯示綁定中,對(duì)于和的綁定將不會(huì)生效。它也是作為機(jī)制的一種替換,解決之前綁定過程各種規(guī)則帶來的復(fù)雜性。 徹底搞懂 JS 中 this 機(jī)制 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)保留出處:https://github.com/jasonGeng88/blog 目錄 t...
閱讀 998·2023-04-26 02:21
閱讀 2818·2021-09-24 09:47
閱讀 1608·2019-08-30 15:55
閱讀 2164·2019-08-30 14:01
閱讀 2320·2019-08-29 14:01
閱讀 2048·2019-08-29 12:46
閱讀 815·2019-08-26 13:27
閱讀 1933·2019-08-26 12:23