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.性能问题
管理内存(内存大小有限制)