先看一段平常開發中遇到的代碼(片斷1)瀏覽器
display()
console.log(name)
var name = "掘金"
function display() {
console.log("平常學習產出")
}
複製代碼
經過控制檯輸出,如圖:
bash
display()
console.log(name)(下面打印的name1,只改了個名稱)
function display() {
console.log("平常學習產出")
}
複製代碼
再執行上面的代碼,結果以下:函數
從上面兩段代碼能夠看出:學習
若是變量聲明用 let、const 關鍵字會出現啥狀況呢
若是用google瀏覽器二次執行片斷1(刷新)又會遇到啥狀況this
JavaScript 調用一個函數或者使用一個變量,不得不在編譯的過程當中先進行聲明和賦值,下面是變量的聲明和賦值google
var name = "掘金"
複製代碼
這段代碼能夠分紅兩部分spa
var name // 聲明部分
name = "掘金" // 賦值部分
複製代碼
以下圖所示:3d
函數的聲明和賦值code
function display() {
console.log("平常學習產出")
}
var display = function() {
console.log("平常學習產出")
}
複製代碼
圖解以下:cdn
變量提高:函數及變量的聲明都將被提高到函數的最頂部。
變量提高並不是從物理層面移動到代碼的最前面,實際上變量和函數聲明在代碼中的位置是不變的,JavaScript代碼是在內存中執行的,因此時常都說JavaScript代碼先編譯,後執行;這個過程會出現兩個模塊:執行上下文和可執行代碼這兩個定義常常都會在各類博客和項目中說起到,後續諸如 this、變量、對象都與之相關
如圖:
從上圖執行流程細化過程當中,編譯階段代碼能夠分紅兩部分:
var name = undefined
function display() {
console.log("平常學習產出")
}
複製代碼
display()
console.log(name)
name = "掘金"
複製代碼
若是出現相同的函數聲明,執行最後一個函數,前面的函數會被覆蓋
若是是下面的狀況又如何:
console.log(display)
display()
var display = function() {
console.log("學習要有產出")
}
複製代碼