JS簡記
阿新 • • 發佈:2018-04-30
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簡記