兩者結合的通常就是一些地方列印出來的結果會出人意料,與預期不符。
基礎是作用域,在es5中作用域只有全域性作用域和函式所代表的區域性作用域(es6中才有 {} 塊級作用域)所以常常有區域性作用域中的隱式全域性變數會影響函式外部的隱式全域性變數值(但是如果是使用var宣告就不會受影響。
接下來是瀏覽器解析js預編譯的幾點原則:
1.會提前解析**,主要應該是將使用var宣告的變數和命名函式提前解析(變數不會提前賦值,但是函式會全部解析,不會提前呼叫)
結果如上圖所示。
2.當函式名和變數重名 函式優先順序更高(函式會先被提公升,然後才是變數)
3.如果函式內部變數或函式有和全域性變數名字相同的,函式自己作用域內的函式或者變數「具有」優先權。
4.無論是全域性還是區域性,儘管預編譯時函式會比變數更先解析,如果名字相同的變數在函式後面,那麼函式可能會被覆蓋
var a =
1functionfn(
) a =
10 console.
log(a)
//10
return
;functiona(
)}fn(
) console.
log(a)
//1
如上面的**所示儘管第乙個console.log肯定輸出return下面的函式本體,但是第二個console.log輸出卻是a=1 js的預編譯 作用域鏈
預編譯發生在函式執行的前一刻 全域性下面 函式裡面 1.js三步驟 首要先做語法分析,若有明顯的低階錯誤語法,就直接報錯,所有 均不執行 預編譯 解釋執行 解釋一行,執行一行。2.函式中的預編譯執行步驟 函式執行的前一刻發生預編譯 step1 建立ao物件,執行期上下文 step2 找到形參和變數宣...
JS作用域和預編譯
js在頁面載入過程中順序執行。但是分塊預編譯 執行。js在執行前會進行類似 預編譯 的操作,而且先預宣告變數再預定義函式。此時注意,是宣告,不是定義,如 var a 1 在預編譯中,只是執行了 var a 沒有賦值,即在預編譯結束時a 為undefined。注意 並不是先全文編譯完在執行,而是塊編譯...
理解Vue中的 編譯作用域
先來考慮下面的 是否最終是可以渲染出來的 中,我們使用了isshow屬性。isshow屬性包含在元件中,也包含在vue例項中。答案 最終可以渲染出來,也就是使用的是vue例項的屬性。為什麼呢?官方給出了一條準則 父元件模板的所有東西都會在父級作用域內編譯 子元件模板的所有東西都會在子級作用域內編譯。...