作用域
變量作用域:就是一個變量可以使用的範圍。
js中首先有一個最外層的作用域,全局作用域
js中可以通過函數來創建一個獨立作用域,其中函數可以嵌套,所以作用域也可以嵌套
例如:
var a = 1; // 全局變量
function foo() {
// 變量提升:函數和變量的聲明會被js的解釋器放到最上面(函數聲明的提升,函數體一同被提升)
console.log(b); // undefined,變量提升造成
var b = 2; // b是foo函數內部聲明的變量,作用域在foo函數內部
console.log(b); // 2
console.log(a); // 1,a是全局作用域,foo函數內部可以訪問
}
console.log(a); // 1
console.log(b); // 報錯,b is not defined;b屬於局部變量,在全局作用域中無法訪問
作用域鏈
變量的查找過程,稱之爲變量的作用域鏈。
// 多級作用域
// 1級
var a = 1;
function foo() {
// 2級
console.log(a); // 1
console.log(b); // undefined
console.log(c); // 報錯,c is not defined,變量爲聲明
function foo1() {
// 3級
var c = 3;
console.log(a); // 1
console.log(b); // undefined
console.log(c); // 3
}
foo1();
var b = 2;
}
foo();
作用域鏈查找變量
1、若是在當前作用域找到變量,就不會再往上繼續查找
var a = 1;
function foo() {
var a = 2;
console.log(a); // 2
}
foo();
2、局部作用域,變量提升
var a = 1;
function foo() {
console.log(a); // undefined
var a = 2;
}
foo();
3、查找上級作用域,只看函數在哪編寫,不看在哪調用
var a = 1;
function foo() {
var a = 2;
return function() {
// 3級
console.log(a); // 2
console.log(b); // undefined
}
var b = 2;
}
var fn = foo();
fn(); // 2, undefined