以前常常會聽到預解釋,預解釋,那麼預解釋究竟是什麼?今天就來淺談一下下。
預解釋也是咱們平時說的變量提聲,在當前做用域中js代碼執行以前,瀏覽器首先會默認的把全部的帶var和function的進行提早的聲明或者定義,這個就能夠叫作預解釋。
那什麼叫作聲明,什麼又叫作定義喃?
聲明:好比面試
var test
那這個就是在告訴瀏覽器咱們在全局做用域中聲明瞭一個叫test的變量瀏覽器
定義:好比函數
test=2
給咱們聲明的變量進行賦值code
那對於帶var 和function關鍵字的,在預解釋中,他們也是不同的。帶var 的在預解釋中只是提早的聲明,而function在預解釋中既要聲明,還要定義,這也就是爲何上面咱們說 「 提早聲明或定義 」
舉個例子作用域
var test = 2 var obj = {"name":"代碼"} function foo (val) { var test2 = val console.log(test2) }
以上代碼在全局做用域中從上往下執行的時候預解釋,首先聲明一個 test,聲明一個obj,再聲明和定義一個foo。那麼在foo裏面的 var test2在全局做用域下會預解釋嗎?固然是不行的, 上面咱們也說過了「 在當前做用域中js執行 」test2在foo的做用域中,只有當foo執行的時候纔會預解釋。因此預解釋是隻發生在當前做用域下的,只有函數執行的時候函數中的纔會預解釋。io
因此咱們可能出去面試的時候就會遇到一些這樣的問題console
console.log(test ) foo(5) var test = 2 console.log(test ) var obj = {"name":"代碼"} function foo (val) { var test2 = val console.log(test2) }
那麼打印出來的內容是什麼喃?function
console.log(test )//undefined foo(5)//5 var test = 2 console.log(test )//2 var obj = {"name":"代碼"} function foo (val) { var test2 = val console.log(test2) }
由於剛開始的時候只是對test作了聲明,可是沒有對它進行定義,因此第一次console是undefind,可是後來到了第二次console的時候,已經把2賦值給了test,因此第二個console是有值的。而foo是function,在預解釋的時候,既要聲明又要定義,因此foo(5)是有值的。test