iT邦幫忙

0

Javascript let 宣告初始化問題和Execution尋找變數

  • 分享至 

  • xImage
  1. 看了線上教學,let和const必須要初始化指派一個值,不像var可以初始化為undefined,但是我跑了以下code,發現怪怪的:
    https://ithelp.ithome.com.tw/upload/images/20220422/20145251bwsx9mTTgv.png
    理論上不是應該和const一樣,出現未初始化錯誤嗎?
    (Missing initializer in declaration)

2.另外再js執行過程,若是跑到function內發現使用沒有宣告的變數,他是會往外global VO 進行搜尋嗎?

let a = 1 ;
function test() {
console.log(a);
}
test();

例如這段EC執行test function時,VO應該找不到變數a的宣告,所以查找上一層global VO?

新手學習JS Execution Context,有點亂,再感謝各位大大指教><

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
deh
iT邦研究生 1 級 ‧ 2022-04-22 18:56:18

1.let 沒設就是undefined,參考

2.

0

let 與 var的作用域性質是一樣的。
差別在於,var 可在重新宣告。但let是不行的。

javascript 的作用域性質比較特殊。
整塊區塊內都會有作用。

再來你說的 const 。
它是一種很特殊的特性。
一般在程式的說法常常是叫他常數宣告。
所謂的常數就是不可在變動的值。

所以你說的「理論上不是應該和const一樣,出現未初始化錯誤嗎?」
的論點是不一樣的東西。

就正規來說

let a;//這樣是可以的。
const b;//這樣是不行的。
const c=10;//這樣是可以的

a=1;     //let var 都算是變數。所以可以改變
c=10;    //這邊會錯。因為常數不可改變

但 javascript 的 const 有個特性。
雖然說常數值不可改變沒錯。
但如果是宣告一物件式的常數
則其物件內的值變動是不會報錯的。

    const c={name:'test',id:1};
    c.name = 'test2';//這樣是沒事的。
iT邦新手 2 級 ‧ 2022-04-23 19:15:33 檢舉

嗨~
路過看到,發現第一句似乎怪怪的。

let 與 var的作用域性質是一樣的。

據我所知,這兩個應該不太一樣。
(但因為我都沒用 var,所以對他不算熟悉。)

記憶中:
let const 都是以 {} block 為界線。
var 是只有 function 與 全域 有區隔。

我也記得作用域var是function/global有區隔,

  1. 在學execution contente裡面有提到var會被納入變數,
  2. 而且跟let不一樣會有hositing特性,也就是可以先宣告fuction,再定義var變數,並不會出現undefined fuction...

其實我的第2個問題只是想確定,如果function內沒出現定義var,js應該會往外尋找global var變數....?

如果有錯再請大大們指導

hi
認真來說,你們說的也是對的。
但我說的其實並不是錯的。

let 與 var 的初始作用域是相同的。
唯一不同的是,var可在區塊內再宣告一個私有的。

let 與 var 。作用域都是包在一個區塊內。
但 let 宣告的,無法在其子域內再做一次let宣告。會爆錯誤。

var可在其子域再宣告一次var。
而會有各自不同的領域。

也有人提到 global 。
只是這在 javascript 來說。其實並沒有所謂的 global 。
只有全覆蓋及子覆蓋的觀念。

所以,就現今的寫法而言。
已經不建議用var宣告的原因是有其意義的。
畢竟它是可以再覆蓋。或是可解釋為再一次私域宣告。

這樣對程式而言來說。容易發生不容易除錯判斷的問題存在。

javascript的變數領域是很奇特的解釋。
一但習慣了後端語言的變數領域後。
會覺得javascript的變數領域很奇特。

多加一個知識。在javascript裏。if跟for都算是一個獨立的區塊。
可試試以下的寫法。看最後會出現什麼。然後再去理解

let i=0;
for(var i=0;i<=10;i++){
    console.log(i);
}
console.log(i);

我要發表回答

立即登入回答