JavaScript 高級(4)- 作用域、作用域鏈 - 學習進行中

作用域

變量作用域:就是一個變量可以使用的範圍。
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章