鍍金池/ 問答/HTML/ 有關(guān)JS的執(zhí)行順序的問題。

有關(guān)JS的執(zhí)行順序的問題。

在【js函數(shù)和變量的聲明與執(zhí)行順序】https://www.cnblogs.com/highs... 這篇文章中看到一個(gè)地方?jīng)]有理解。
圖片描述

沒有理解為什么第3行代碼處alert的值為什么是undefined?

我的想法是,預(yù)編譯期時(shí)候,js獲取到了聲明的var a,這個(gè)時(shí)候只是聲明,并沒有賦值。
然后預(yù)編譯結(jié)束。
接下來開始從上往下執(zhí)行代碼:執(zhí)行第一行 var a=1;,然后再往下執(zhí)行f()的時(shí)候,調(diào)用f方法:alert(a), 這個(gè)時(shí)候不是已經(jīng)執(zhí)行過第一行,a已經(jīng)有值了嗎?

還是我繞進(jìn)了什么我沒出來的彎子...?

求指點(diǎn)

回答
編輯回答
茍活

1.函數(shù)提升
function f(){
var a;
alert(a)
a = 3
alert(a)
}
var a;
2. 賦值
function f(){
var a;
alert(a)
a = 3
alert(a)
}
var a;
a = 1;

第一個(gè)alert(a)的時(shí)候,js 執(zhí)行時(shí)候會從作用域去找 a , 那本身函數(shù)的作用域里 就有一個(gè) a , 那么找到時(shí)候就不會再往全局去找,此時(shí)a就是 undefined , 第二個(gè) alert(a)此時(shí) a已經(jīng)賦值為 3 那么這時(shí)候打印3.

2017年7月12日 15:05
編輯回答
北城荒

變量聲明提升
第三行執(zhí)行的時(shí)候查找 a 這時(shí)候會在本作用域內(nèi)找 這時(shí)候本作用域內(nèi)的a只是聲明未賦值 所以是undefined

var a = 1;

function f(){
  var a;//聲明 被提升到了作用域頂部
  alert(a); // 執(zhí)行的時(shí)候查找 a 這時(shí)候會在本作用域內(nèi)找 這時(shí)候本作用域內(nèi)的a只是聲明未賦值 所以是undefined
  a = 3; 
  alert(a);
}

f()
2017年1月27日 08:36
編輯回答
若相惜

作用域問題。function 聲明時(shí)也有預(yù)處理,f() 函數(shù)內(nèi)部聲明的a被提升到了函數(shù) scope 頂部且值為 undefinded。
簡單來說第三行的 alert 取的是第四行的 a

2017年9月17日 04:34
編輯回答
遲月

在函數(shù)內(nèi)部存在var a;所以函數(shù)內(nèi)部alert(a)就不會去函數(shù)外部找變量a了,在加上函數(shù)內(nèi)部也存在變量提升,所以var a = 3 會將var a;提升到函數(shù)最前面。執(zhí)行到第一個(gè)alert(a)的時(shí)候,a是聲名了但是沒有賦值。因此輸出undefined. 可以對比一下代碼:
var a = 1;
function f(){
alert(a);//1
a = 3;
alert(a);//3
}

f()

2018年1月24日 10:15