function foo() {
var abc=1;
}
console.log(abc); //報錯:abc is not defined
//這裏abc僅僅存在foo內部
function foo() {
var abc=1;
function foo2() {
console.log(abc);
}
}
foo(); //此時不會進行任何輸出
//這裏僅僅是在foo內部寫了foo2方法,並未執行foo2方法
function foo() {
var abc=1;
function foo2() {
console.log(abc);
}
foo2(); //此處執行
}
foo(); //1
function foo() {
var abc=1;
function foo2() {
var abc;
console.log(abc);
}
foo2();
}
foo(); //undefined
//foo2內部輸出語句會先在內部找abc,若找不到再去外部找,此時foo2內部聲明的abc並未賦值
function foo() {
var abc=1;
function foo2() {
console.log(abc);
var abc;
}
foo2();
}
foo(); //undefined
//並不會輸出1,var會聲明提升,可以理解爲將變量聲明從它們所在代碼中出現的位置移到該作用域最上面
function foo() {
var abc=1;
function foo2() {
console.log(abc);
let abc;
}
foo2();
}
foo(); //報錯:無法在初始化之前訪問'abc'
// let不會聲明提升,但只要塊級作用域內存在let命令,它所聲明的變量就“綁定”這個區域,不再受外部的影響。
(暫時性死區,詳情:https://es6.ruanyifeng.com/#docs/let)