w3schools:Scope determines the accessibility (visibility) of variables
a=20
var a = 20
function test() {
console.log(a);//20
};
test();
console.log(a);// 20
var a = 10;
test()
中宣告var a = 10;
,只有在該範圍內可以取得 var a = 20
function test() {
var a = 10;
console.log(a);//10
};
test();
console.log(a);// 20
console.log(a)
就沒有 function test() {
var a = 10;
console.log(a);//10
};
test();
console.log(a);// a is not defined
ES6以前,如使用 var 宣告,作用域是以 function 為基準
ES6開始,只要有 let 和 const 宣告的block({ }
)就是一個新的作用域 => Block Scope
//var的作用域是整個function,所以他可以取得b = 10
function test() {
var a = 60;
if (a === 60) {
var b = 10
}
console.log(b); //10
}
test()
//在if中,宣告方式改為let,就無法印出b,因為他的作用域就只有在if這個block中
function test() {
var a = 60;
if (a === 60) {
let b = 10
}
console.log(b); //ReferenceError: b is not defined
}
test()
inner()
中,沒有宣告a,所以它會往上一層找
var a = 'global'
function test() {
var a = 'test scope a';
var b = 'test scope b';
console.log(a, b); //JS 19行
function inner() {
var b = 'inner scope b';
console.log(a, b); //JS 22行
}
inner();
}
test();
console.log(a); //JS 29行
參考資料:
lidemy:進階 JavaScript:那些你一直搞不懂的地方
Scope 作用域
Day 6:湯姆克魯斯與唐家霸王槍——變數的作用域(Scope)