摘要:但是如果非全局的變量如果被遮蔽了,無論如何都無法被訪問到。但是如果引擎在代碼中找到,就會(huì)完全不做任何優(yōu)化。結(jié)構(gòu)的分句中具有塊級(jí)作用域。第四章提升編譯器函數(shù)聲明會(huì)被提升,而函數(shù)表達(dá)式不會(huì)被提升。
本書屬于基礎(chǔ)類書籍,會(huì)有比較多的基礎(chǔ)知識(shí),所以這里僅記錄平常不怎么容易注意到的知識(shí)點(diǎn),不會(huì)全記,供大家和自己翻閱;
上中下三本的讀書筆記:
《你不知道的JavaScript》 (上) 讀書筆記
《你不知道的JavaScript》 (中) 讀書筆記
《你不知道的JavaScript》 (下) 讀書筆記
第一部分 作用域和閉包 第二章 詞法作用域 詞法查找全局變量會(huì)自動(dòng)成為全局對(duì)象(瀏覽器中是 window) 的屬性,因此是不可以直接通過全局對(duì)象的此法名稱,而是間接地通過全局對(duì)象屬性的應(yīng)用來對(duì)其進(jìn)行訪問 window.a,通過這種方法可以訪問那些被同名變量所遮蔽的全局變量。但是如果非全局的變量如果被遮蔽了,無論如何都無法被訪問到。
欺騙詞法如果詞法作用域完全由寫代碼期間函數(shù)所生命的位置來定義,那么可以通過幾種方法來欺騙(修改)詞法作用域,比如 eval、with 但是要注意:欺騙詞法作用域會(huì)導(dǎo)致性能下降。
因?yàn)镴S引擎會(huì)在編譯階段進(jìn)行性能優(yōu)化,其中有些優(yōu)化依賴于能夠根據(jù)代碼的詞法進(jìn)行靜態(tài)分析,并預(yù)先確定所有變量和函數(shù)的定義位置,才能在執(zhí)行過程中快速找到標(biāo)識(shí)符。但是如果引擎在代碼中找到 eval、with ,就會(huì)完全不做任何優(yōu)化。
第三章 函數(shù)作用域和塊作用域 函數(shù)作用域包裝函數(shù)的聲明以 function 關(guān)鍵字開始,那么就是函數(shù)聲明,而下面這個(gè)例子是以 (function 開始,那么就是函數(shù)表達(dá)式:
const a = 1; function foo() { // 函數(shù)聲明 const a = 4; console.log(a); } (function foo() { // 函數(shù)表達(dá)式 const a = 3; console.log(a); }()) console.log(a);
所以上面的 IIFE 將會(huì)被當(dāng)做函數(shù)表達(dá)式而不是一個(gè)函數(shù)聲明來處理;
函數(shù)聲明和函數(shù)表達(dá)式之間最重要的區(qū)別是他們的名稱標(biāo)識(shí)符會(huì)綁定在何處。
函數(shù)聲明的名稱標(biāo)識(shí)符 foo 會(huì)被綁定在所在作用域中,可以直接通過 foo() 來調(diào)用;而函數(shù)表達(dá)式的 foo 被綁定在函數(shù)表達(dá)式只剩的函數(shù)中而不是所在作用域中;
同時(shí),即使是具名的函數(shù)表達(dá)式,名稱標(biāo)識(shí)符在賦值之前也無法在所在作用域中使用。
try/catch 結(jié)構(gòu)的 catch 分句中具有塊級(jí)作用域。
第四章 提升 編譯器函數(shù)聲明會(huì)被提升,而函數(shù)表達(dá)式不會(huì)被提升。
函數(shù)優(yōu)先函數(shù)聲明和變量聲明都會(huì)被提升,但是函數(shù)會(huì)首先被提升,然后才是變量。
foo() // 1 var foo function foo() { console.log(1) } foo = function() { console.log(2) }
函數(shù)聲明 foo 會(huì)首先被提升,然后打印出 1,后面的 var 聲明會(huì)被認(rèn)為是重復(fù)聲明而被忽略;但是注意如果后面出現(xiàn)同名函數(shù)聲明,則會(huì)覆蓋前面的:
foo() // 2 function foo() { console.log(1) } function foo() { console.log(2) }第二部分 this和對(duì)象原型 第一章 關(guān)于this this到底是什么
this 實(shí)際上是在函數(shù)被調(diào)用時(shí)發(fā)生的綁定,它指向什么完全取決于函數(shù)在哪里被調(diào)用,并不是在編寫時(shí)綁定。當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),會(huì)創(chuàng)建一個(gè)執(zhí)行上下文,它包含函數(shù)在哪里被調(diào)用(調(diào)用棧)、函數(shù)的調(diào)用方式、傳入的參數(shù)等信息,this 就是這個(gè)記錄的一個(gè)屬性,會(huì)在函數(shù)執(zhí)行的過程中用到。
判斷this我們可以根據(jù)優(yōu)先級(jí)來判斷 this:
new 綁定: 函數(shù)是否是在 new 中調(diào)用,如果是的話, this 綁定的是新創(chuàng)建的對(duì)象;
var bar = new foo()
顯式綁定: 函數(shù)是否通過 call、apply 或者硬綁定調(diào)用,如果是的話,this 綁定的是指定的對(duì)象;
var bar = foo.call(obj)
隱式綁定: 函數(shù)是否在某個(gè)上下文對(duì)象中調(diào)用,如果是的話 this 綁定的是那個(gè)上下文對(duì)象;
var bar = obj.foo()
默認(rèn)綁定: 如果都不是的話,在嚴(yán)格模式下綁定到 undefined ,非嚴(yán)格模式綁定到全局對(duì)象;
var bar = foo()
例外被忽略的情況: 比如把 null、undefined 作為 this 的綁定對(duì)象傳入 call、apply、bind ,那么這些值在調(diào)用時(shí)會(huì)被忽略,實(shí)際應(yīng)用的是默認(rèn)綁定;
箭頭函數(shù): 箭頭函數(shù)根據(jù)外層作用域來決定 this,且箭頭函數(shù)的綁定無法被修改,new 也不可以;
PS:歡迎大家關(guān)注我的公眾號(hào)【前端下午茶】,一起加油吧~
另外可以加入「前端下午茶交流群」微信群,長按識(shí)別下面二維碼即可加我好友,備注加群,我拉你入群~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100836.html
摘要:本書屬于基礎(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)就這么少,非...
摘要:這時(shí)候控制臺(tái)看到的是對(duì)象的快照,然而點(diǎn)開看詳情的話是這段代碼在運(yùn)行的時(shí)候,瀏覽器可能會(huì)認(rèn)為需要把控制臺(tái)延遲到后臺(tái),這種情況下,等到瀏覽器控制臺(tái)輸出對(duì)象內(nèi)容時(shí),可能已經(jīng)運(yùn)行,因此會(huì)在點(diǎn)開的時(shí)候顯示,這是的異步化造成的。 本書屬于基礎(chǔ)類書籍,會(huì)有比較多的基礎(chǔ)知識(shí),所以這里僅記錄平常不怎么容易注意到的知識(shí)點(diǎn),不會(huì)全記,供大家和自己翻閱; 上中下三本的讀書筆記: 《你不知道的JavaScri...
摘要:請(qǐng)記住,這些書中的一些可能不是最新的,但概念和基礎(chǔ)仍應(yīng)適用。是最好的老師之一。的秘密由部分組成。在你完成這些書后,查看書籍和最好的本土?xí)? 我看過三本,第1本,第二本,第四本。第一本買的的實(shí)體書,其他兩本看的是電子書。第一本是大名鼎鼎老道寫的,書很薄,但是非常經(jīng)典。javascirpt忍者秘籍是jquery的作者寫的,也是非常經(jīng)典。you dont kown js系列也是非常好??戳?..
摘要:目錄不要過度依賴一前端掘金毫無疑問,是一款非常優(yōu)秀的庫,它讓我們開發(fā)項(xiàng)目變得更加便捷容易。但是作為一個(gè)前端工作者,我們肯定也希望在我們的網(wǎng)頁里也能看到這么酷分鐘搞定常用基礎(chǔ)知識(shí)前端掘金基礎(chǔ)智商劃重點(diǎn)在實(shí)際開發(fā)中,已經(jīng)非常普及了。 跨域解決方案總結(jié) - 前端 - 掘金為什么需要跨域? 就得先知道同源策略. 同源策略 同源策略是為了保證數(shù)據(jù)的安全性,一個(gè)域的腳本不能去操作另外一個(gè)域的腳本的...
閱讀 2141·2023-04-26 00:50
閱讀 2514·2021-10-13 09:39
閱讀 2257·2021-09-22 15:34
閱讀 1648·2021-09-04 16:41
閱讀 1367·2019-08-30 15:55
閱讀 2465·2019-08-30 15:53
閱讀 1734·2019-08-30 15:52
閱讀 779·2019-08-29 16:19