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