JS讀書筆記摘抄

2021-08-25 11:05:37 字數 2662 閱讀 4571

閱讀《你不知道的js》書筆記摘抄

牽涉的角色

對於var a =2 的理解

1. 遇到 var a,編譯器會詢問作用域是否已經有乙個該名稱的變數存在於同乙個作用域的

集合中。如果是,編譯器會忽略該宣告,繼續進行編譯;否則它會要求作用域在當前作用域的集合中宣告乙個新的變數,並命名為 a。

2. 接下來編譯器會為引擎生成執行時所需的**,這些**被用來處理 a = 2 這個賦值

操作。引擎執行時會首先詢問作用域,在當前的作用域集合中是否存在乙個叫作 a 的變數。如果是,引擎就會使用這個變數;如果否,引擎會繼續查詢該變數(檢視 1.3

節)。總結:變數的賦值操作會執行兩個動作,首先編譯器會在當前作用域中宣告乙個變數(如果之前沒有宣告過),然後在執行時引擎會在作用域中查詢該變數,如果能夠找到就會對它賦值。總之無論是編譯器還是引擎都需要詢問作用域是否存在該宣告變數

引擎在作用域中的查詢流程

在上面第二步中的引擎查詢宣告變數會牽涉到lhs 和 rhs兩個查詢方式:

- rhs:通俗理解獲得某某的值

- lhs:試圖找到存放變數的容器本身

lhs 與 rhs的查詢引發的異常種類

function

foo(a)

foo( 2 );

rhs:

第一次對 b 進行 rhs 查詢時是無法找到該變數的。如果 rhs 查詢在所有巢狀的作用域中遍尋不到所需的變數,引擎就會丟擲 referenceerror

異常。 如果 rhs 查詢找到了乙個變數,但是你嘗試對這個變數的值進行不合理的操作,比如試圖對乙個非函式型別的值進行函式呼叫,或著引用 null 或 undefined 型別的值中的

屬性,那麼引擎會丟擲另外一種型別的異常,叫作 typeerror。

lhs:

引擎執行 lhs 查詢時,如果在頂層(全域性作用域)中也無法找到目標變數,

全域性作用域中就會建立乙個具有該名稱的變數,並將其返還給引擎,前提是程式執行在非

「嚴格模式」下。因此,在嚴格模式中 lhs 查詢失敗時,並不會建立並返回乙個全域性變數,引擎會丟擲同 rhs 查詢失敗時類似的 referenceerror 異常。

當進行變數的查詢時(無論是rhs還是lhss),就會向上級作用域繼續查詢目標識別符號,這樣每次上公升一級作用域(一層樓),最後抵達全域性作用域(頂層),無論找到或沒找到都將停止。

詞法作用域意味著作用域是由書寫**時函式宣告的位置來決定的。編譯的詞法分析階段基本能夠知道全部識別符號在**以及是如何宣告的,從而能夠**在執行過程中如何對它們進行查詢。

當由於巢狀詞法作用域導致全域性變數被隱藏的時候,可以採用window.變數名來訪問隱藏的全域性變數

欺騙詞法作用域的方法

- eval():通常被用來執行動態建立的**,把引數**偽裝成原來就是寫在eval()函式出現的位置

- with():一般用於訪問同乙個物件的多個屬性的快速訪問

function

foo(obj)

}var o1 = ;

var o2 = ;

foo( o1 );

console.log( o1.a ); // 2

foo( o2 );

console.log( o2.a ); // undefined

console.log( a ); // 2——不好,a 被洩漏到全域性作用域上了!

至於為什麼會洩漏到全域性域上,書上這樣解釋的:with 宣告實際上是根據你傳遞給它的物件憑空建立了乙個全新的詞法作用域但當我們將 o2 作為作用域時,其中並沒有 a 識別符號,因此進行了正常的 lhs 識別符號查詢(檢視第 1 章)。找不到就會lhs在全域性作用域上自己私自建了乙個變數

在任意**片段外部新增包裝函式,可以將內部的變數和函式定義「隱

藏」起來,外部作用域無法訪問包裝函式內部的任何內容,更進一步,如果不希望汙染作用域可以用iife來實現

(function

foo())();

原生js沒有塊作用域

從 es3 開始,try/catch 結構在 catch 分句中具有塊作用域。

在 es6 中引入了 let 關鍵字(var 關鍵字的表親),用來在任意**塊中宣告變數。但是let宣告沒有變數提公升的作用。if

(..) 會宣告乙個劫持了 if 的 塊的變數,並且將變數新增到這個塊中。

const也是es6支援的區域性作用域關鍵字,但是一般用於修飾常量,不能被修改!!

先有宣告 ,才有賦值

函式宣告和變數宣告都會被提公升。但是乙個值得注意的細節(這個細節可以出現在有多個

「重複」宣告的**中)是函式會首先被提公升,然後才是變數。(函式表示式不會被提公升)

var a

;a = 2

;console.log( a );

輸出2console.log( a );

var a = 2

; 輸出 undefined

《做單》的讀書筆記摘抄

把自己的銷售需求轉換成別人的 生死需求 才能達到控制其為銷售目標服務的目的。例子 人民幣可在所有人的利益需求間轉換,所以要把你的需求轉換 民幣來滿足利益鏈上的所有決策人間的利益轉換。所有的銷售工作都是圍繞在滿足客戶 color red b 真正 b color 需求而展開的。挖掘需求的時候,開放式的...

讀書筆記 10日摘抄整理 07

莎士比亞說 世間事,也有漲潮時節,及時把握,終可功成名就。羅曼 羅蘭說 人們常覺得準備的階段是在浪費時間,只有當真正的機會來臨,而自己沒有能力把握的時候,才能覺悟到自己平時沒有準備才是浪費了時間。梭羅在 瓦爾登湖 裡說過 神聖的經典裡有 般的文字,是古代最聰明的智者說出來的話,它們的價值是歷代的聰明...

Books系列 《月童度河》摘抄及讀書筆記

title 月童度河 摘抄及讀書筆記 date 2020 01 28 15 13 47 categories 2020年庚子鼠年,在輸水中度過,感冒使得整個人萎靡了許多。恰逢武漢新型肺炎擴散,一時全國人心惶惶,本就漸淡的年味也就消失殆盡了。像這樣的時間,靜下心來看看書也是極好的一件事。月童度河就在這...