鍍金池/ 問答/HTML/ es6 塊級(jí)作用域

es6 塊級(jí)作用域

es6 塊級(jí)作用域let

在下面代碼中為什么不加上let a = 2000 這句話,console.log(a) 結(jié)果是 100;而加上這句后為什么會(huì)報(bào)錯(cuò)a為定義。
我是在學(xué)習(xí)es6中l(wèi)et的知識(shí)點(diǎn)是遇到的。

var a = 100, b = 10;
function fun(){
    if(true){
        console.log(a);
        let a = 2000;
    }
}
fun();// 請(qǐng)把代碼文本粘貼到下方(請(qǐng)勿用圖片代替代碼)

如果是if里面是var a =200;那么console.log(a)的結(jié)果是undefined,為什么換成let后 程序在這里報(bào)錯(cuò)了?

回答
編輯回答
貓小柒

1.全局變量,沒有訪問限制
2.局部變量,if內(nèi)部為塊級(jí)作用域,所以變量聲明前無法訪問,否則報(bào)錯(cuò)
3.內(nèi)部使用var聲明變量,首先明確一點(diǎn),js在執(zhí)行前會(huì)有一個(gè)變量提取過程,這個(gè)過程被稱為預(yù)解析。

解析過程中變量a的變化:
代碼解析    賦值:a —> undefined 
代碼執(zhí)行    賦值:a -> 100 
fun函數(shù)解析 賦值:a -> undefined (由于內(nèi)部使用var聲明,會(huì)覆蓋掉外部聲明)
fun函數(shù)執(zhí)行 -> console.log(a) -> undefined
              賦值:a -> 2000 
2017年12月8日 18:21
編輯回答
礙你眼
2018年5月7日 19:07
編輯回答
糖果果

let在包含聲明的作用域頂部被創(chuàng)建,通常這種被叫做“變量提升”。但和var不同的是,var的創(chuàng)建會(huì)設(shè)置一個(gè)初試的undefined值,let變量在沒有運(yùn)行到聲明代碼時(shí)是不會(huì)被初始化的。引用它將會(huì)導(dǎo)致 ReferenceError(而使用 var 聲明變量則恰恰相反,該變量的值是 undefined )。直到初始化執(zhí)行的時(shí)候,該變量都處于從塊開始到初始化處理的“暫存死區(qū)”。

function do_something() {
  console.log(bar); // undefined
  console.log(foo); // ReferenceError: foo is not defined
  var bar = 1;
  let foo = 2;
}

參見:https://developer.mozilla.org...

2017年3月4日 07:37
編輯回答
爆扎

var用法存在變量提升,就是在用到變量的時(shí)候,會(huì)在作用域內(nèi)找這個(gè)變量。所以在console.log(a)的時(shí)候,在全局找var a,提升之后,相當(dāng)于var a ; console.log(a);
let和const都不會(huì)變量提升,就是在console.log(a)的時(shí)候,let a在后面,相當(dāng)于a還未定義,所以是undefined
https://segmentfault.com/a/11...
之前看到的,ES6的用法,你可以瞅一眼。

2018年1月24日 08:37
編輯回答
心夠野

因?yàn)槟阌?code>var會(huì)有個(gè)變量提升 var hoisting,所以不會(huì)報(bào)錯(cuò)。
源代碼

function fun() {
  if (true) {
    console.log(a);
    var a = 2000;
  }
}

變量提升后等于是這樣

function fun() {
  var a;
  if (true) {
    console.log(a);
    a = 2000;
  }
}

而用let就沒有這個(gè)概念,你引用了未定義變量當(dāng)然就報(bào)錯(cuò)了。

2018年5月12日 15:07
編輯回答
神曲

沒有 let 輸出 外面全局變量 var a = 100

有 let 會(huì)出現(xiàn)暫時(shí)性死區(qū), 直到 let a = 2000; a 都未定義

改 let 為 var, 存在變量提升, 相當(dāng)于如下代碼

if (true) {
    var a;
    console.log(a);
    a = 2000
}
2018年6月4日 01:35