4.2 执行环境和作用域

执行环境和作用域

每个函数都有自己的执行环境
作用域链(scope chain)
作用:保证执行环境有权访问的所有变量和函数的有序访问。
理解:以函数为界限,每个函数都有自己的变量对象,自己界限的变量是可以访问的。也可以访问外围包围住这个函数里面的变量。但是大(外围)函数不能访问此函数里面的变量。函数执行完会被销毁。

每个函数有自己的执行环境,当执行流进入一个函数的时候,函数的环境就会被推入到一个环境栈中。而函数执行完后,栈就会将其环境弹出。

内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数

var color = "blue";
function changeColor(){
	var anotherColor = "red";

	function swapColors(){
		var tempColor = anotherColor;
		anotherColor = color;
		color = tempColor;
		l(color);
		l(anotherColor);
		l(tempColor);
	}
	l(color);
	l(anotherColor);
	swapColors();
}
l(color);
changeColor();

延长作用域链(try-catch catch, with)

function buildUrl(){
	var qs = "?debug=true";
	with(location){
		var url = href + qs;
	}
	return url;
}

没有块级作用域(for,if,switch)
1.声明变量
使用var声明会被自动添加到最接近的环境中,没有var声明
会被添加到全局变量中。

function add(num1, num2){
	var sum = num1 + num2;
	return sum;
}

var result = add(10, 20);
l(sum);//undefined

function add(num1, num2){
	sum = num1 + num2;
	return sum;
}

var result = add(10, 20);
l(sum);//30

2.查询标识符
首先在本函数作用域查找,有这个变量就输出,不然一直往上级查找。

var color = "blue";
function getColor(){
	return color;
}
l(getColor());//blue

var color = "blue";
function getColor(){
	var color = "red";
	return color;
}
l(getColor());//red

变量提升
var color = "blue";
function getColor(){
	
	return color;
	var color = "red";

	// var color;
	//return color;
	//color = "red"
}
l(getColor());//undefined

垃圾收集(javascript垃圾自动收集机制)
1.标记清除
2.引用计数
3.性能问题

管理内存(内存大小有限制)

原文地址:https://www.cnblogs.com/caijw/p/8066817.html