1. 程式人生 > >JS簡記

JS簡記

div efi 就會 pre 編譯 規則 reference 作用域 發現

var a = 1;
console.log(a);

第一行代碼var a=1,會被引擎看成兩句話:var a和a=1。

首先,會由編譯器詢問當前作用域內(這裏就是全局作用域)是否存在已經聲明的變量a,如果存在則忽略var a,否則在當前作用域內聲明變量a(這時,作用域內就有了變量a。測試時可以發現,即便兩行代碼倒置順序,並不會拋ReferenceError,而是打印undefined,說明引擎首先會提前通過編譯器執行代碼中所有的聲明操作)。

其次,編譯器聲明變量a(即在作用域內生成了變量a)後,就會編譯a=1語句,編譯後的語句由執行引擎執行。

最後,在執行引擎執行時,也就是在執行被編譯後的a=1時,首先會進行LHS(左查找,目的是找到變量所在的容器,順著作用域鏈查找,如果最終在全局作用域中仍未找到,則會默認在全局作用域內聲明該變量,但如果是“use strict”,則與RHS未找到一樣,拋ReferenceError),然後在賦值1。

var o = {};
o.b = 1;
console.log(o.b);

引擎在執行o.b=1時(假設已被編譯器編譯),首先會LHS查找變量o,然後使用對象訪問規則訪問o的b屬性,這裏就是對b賦值1。

JS簡記