摘要:話不多說,讓我們一起探討你不知道的牛刀小試答案初露鋒芒答案函數(shù),第行是一個(gè)定時(shí)器,哪怕定時(shí)器的延遲時(shí)間為,仍然先執(zhí)行第行。故為當(dāng)使用定時(shí)器調(diào)用函數(shù)時(shí),先執(zhí)行函數(shù)內(nèi)代碼,在進(jìn)行函數(shù)調(diào)用。如果都不是的話,使用默認(rèn)綁定。
MDN中的this定義
當(dāng)前執(zhí)行代碼的環(huán)境對(duì)象。
多么簡(jiǎn)約凝練的概括,寥寥11個(gè)字,將伴隨程序員的前世今生。話不多說,讓我們一起探討你不知道的this
牛刀小試function foo() { console.log( this.a ); } var a = 10; foo();
答案:
10
this —> window
function foo() { console.log( this.a ); } var obj2 = { a: 42, foo: foo }; var obj1 = { a: 2, obj2: obj2 }; obj1.obj2.foo();
42初露鋒芒
this -> obj2
function foo() { setTimeout(() => this.a = 1, 0) console.log( this.a ); } function foo2() { setTimeout(() => this.a = 1, 500) console.log( this.a ); } function doFoo(fn) { this.a = 4 fn(); } var obj = { a: 2, foo: foo, foo2: foo2 }; var a =3 doFoo( obj.foo ); setTimeout( obj.foo, 0 ) setTimeout( obj.foo2, 100 )
答案:展露頭腳
4
1
1
foo函數(shù),第2行是一個(gè)定時(shí)器,哪怕定時(shí)器的延遲時(shí)間為0,仍然先執(zhí)行第3行。故為4
當(dāng)使用定時(shí)器調(diào)用函數(shù)時(shí),先執(zhí)行函數(shù)內(nèi)代碼,在進(jìn)行函數(shù)調(diào)用。故為1
同理: 故為1
a = 3 function foo() { console.log( this.a ); } var obj = { a: 2 }; foo.call( obj ); foo.call( null ); foo.call( undefined ); foo.call( ); var obj2 = { a: 5, foo } obj2.foo.call() // 3,不是5! //bind返回一個(gè)新的函數(shù) function foo(something) { console.log( this.a, something ); return this.a + something; } var obj = { a: 2 } var bar = foo.bind( obj ); var b = bar( 3 ); console.log( b );
答案:銳不可當(dāng) 隱式丟失
2 undefined
3 undefined
3 undefined
3 undefined
3 undefined
2 3
5
第8行: this -> obj = 2, msg沒有傳值,故為undefined
第9~12行: 當(dāng)call的第一個(gè)參數(shù)為null, undefined或者不傳值時(shí),只想window, this -> window = 3, msg沒有傳值,故為undefined
第25行:bind改變指向 -> obj,第26行:msg為3, 故為2 3
第27行:執(zhí)行函數(shù),為2+3 = 5
一個(gè)最常見的 this綁定問題就是被隱式綁定的函數(shù)會(huì)丟失綁定對(duì)象,也就是說它會(huì)應(yīng)用默認(rèn)綁定,從而把 this 綁定到全局對(duì)象或者 undefined 上,取決于是否是嚴(yán)格模式
function foo() { console.log( this.a ); } function doFoo(fn) { fn() } var obj = { a: 2, foo: foo }; var a = "oops, global"; doFoo( obj.foo );
答案: oops, global舍我其誰(shuí)
第5行fn()引用第位置其實(shí)foo, 因此doFoo()相當(dāng)于是一個(gè)不帶修飾符的函數(shù)調(diào)用,因此應(yīng)用了默認(rèn)綁定—> window = oops, global
function foo(something) { this.a = something; } var obj1 = { foo: foo }; var obj2 = {}; obj1.foo( 2 ); console.log( obj1.a ); obj1.foo.call( obj2, 3 ); console.log( obj2.a ); var bar = new obj1.foo( 4 ); console.log( obj1.a );
答案:總結(jié)
2
3
2
4
new 綁定比隱式綁定優(yōu)先級(jí)高,也閉隱式綁定綁定優(yōu)先級(jí)高
函數(shù)是否在new中調(diào)用(new綁定)?如果是的話this綁定的是新創(chuàng)建的對(duì)象。
var bar = new foo()
函數(shù)是否通過call、apply(顯式綁定)或者硬綁定調(diào)用?如果是的話,this綁定的是 指定的對(duì)象。
var bar = foo.call(obj2)
函數(shù)是否在某個(gè)上下文對(duì)象中調(diào)用(隱式綁定)?如果是的話,this 綁定的是那個(gè)上 下文對(duì)象。
var bar = obj1.foo()
如果都不是的話,使用默認(rèn)綁定。如果在嚴(yán)格模式下,就綁定到undefined,否則綁定到 全局對(duì)象。
var bar = foo()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106865.html
摘要:現(xiàn)在流行的前端框架都支持自定義組件,組件化開發(fā)已經(jīng)成為提高前端開發(fā)效率的銀彈。二對(duì)自定義組件的支持要想正確的渲染組件,第一步就是要告訴某個(gè)標(biāo)簽是自定義組件。下面的例子里,就是一個(gè)自定義組件。解決了識(shí)別自定義標(biāo)簽的問題,下一步就是定義標(biāo)簽了。 歡迎關(guān)注我的公眾號(hào)睿Talk,獲取我最新的文章:showImg(https://segmentfault.com/img/bVbmYjo); 一、...
摘要:如果列表是空的,則存入組件后將異步刷新任務(wù)加入到事件循環(huán)當(dāng)中。四總結(jié)本文基于上一個(gè)版本的代碼,加入了事件處理功能,同時(shí)通過異步刷新的方法提高了渲染效率。 歡迎關(guān)注我的公眾號(hào)睿Talk,獲取我最新的文章:showImg(https://segmentfault.com/img/bVbmYjo); 一、前言 目前最流行的兩大前端框架,React和Vue,都不約而同的借助Virtual DO...
摘要:本書屬于基礎(chǔ)類書籍,會(huì)有比較多的基礎(chǔ)知識(shí),所以這里僅記錄平常不怎么容易注意到的知識(shí)點(diǎn),不會(huì)全記,供大家和自己翻閱不錯(cuò),下冊(cè)的知識(shí)點(diǎn)就這么少,非常不推介看下冊(cè)上中下三本的讀書筆記你不知道的上讀書筆記你不知道的中讀書筆記你不知道的下讀書筆記第三 本書屬于基礎(chǔ)類書籍,會(huì)有比較多的基礎(chǔ)知識(shí),所以這里僅記錄平常不怎么容易注意到的知識(shí)點(diǎn),不會(huì)全記,供大家和自己翻閱; 不錯(cuò),下冊(cè)的知識(shí)點(diǎn)就這么少,非...
下一篇:《你不知道的javascript》筆記_對(duì)象&原型 寫在前面 上一篇博客我們知道詞法作用域是由變量書寫的位置決定的,那this又是在哪里確定的呢?如何能夠精準(zhǔn)的判斷this的指向?這篇博客會(huì)逐條闡述 書中有這樣幾句話: this是在運(yùn)行時(shí)進(jìn)行綁定的,并不是在編寫時(shí)綁定,它的上下文取決于函數(shù)調(diào)用時(shí)的各種條件this的綁定和函數(shù)聲明的位置沒有任何關(guān)系,只取決于函數(shù)的調(diào)用方式當(dāng)一個(gè)函數(shù)被調(diào)用時(shí)...
摘要:但是如果非全局的變量如果被遮蔽了,無(wú)論如何都無(wú)法被訪問到。但是如果引擎在代碼中找到,就會(huì)完全不做任何優(yōu)化。結(jié)構(gòu)的分句中具有塊級(jí)作用域。第四章提升編譯器函數(shù)聲明會(huì)被提升,而函數(shù)表達(dá)式不會(huì)被提升。 本書屬于基礎(chǔ)類書籍,會(huì)有比較多的基礎(chǔ)知識(shí),所以這里僅記錄平常不怎么容易注意到的知識(shí)點(diǎn),不會(huì)全記,供大家和自己翻閱; 上中下三本的讀書筆記: 《你不知道的JavaScript》 (上) 讀書筆記...
摘要:的定義執(zhí)行上下文。這本書也是舉了好幾個(gè)例子來(lái)說明,這句話的含義。我個(gè)人也認(rèn)為,不通過代碼,非常難說明問題。所以,修改的是全局的,并不是自身的。 this 先說明一下,this是我JavaScript的盲區(qū),寫這篇文章,就是為了讓自己能重新認(rèn)識(shí)this,并且搞清楚,js里面的this,到底是什么。 這個(gè)系列主要是記錄我自己看《你不知道的JavaScript》這本書的筆記。 this的定義...
閱讀 1695·2021-11-23 09:51
閱讀 3218·2021-09-26 10:21
閱讀 814·2021-09-09 09:32
閱讀 893·2019-08-29 16:06
閱讀 3322·2019-08-26 13:36
閱讀 783·2019-08-26 10:56
閱讀 2575·2019-08-26 10:44
閱讀 1155·2019-08-23 14:04