让学习“上瘾”,成为更好的自己!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script>
/*
执行环境:定义了变量或函数有权访问的其他数据,决定了他们各自的行为【可以理解为“作用域”】
每个执行环境都有一个与之关联的“变量对象”,环境中的定义的所有变量和函数都保存在这个对象中
我们无法访问,解析器在处理数据时会在后台使用他
a, 全局执行环境:window对象
所有的全局变量和函数都是作为window对象的属性和方法创建的
某个执行环境的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁
b, 每个函数都有自己的执行环境,当“执行流”进入一个函数时,函数的环境就会被推入一个环境栈中,函数执行完毕后,栈将其环境弹出,把控制权返回到之前的执行环境
c, 当代码在一个环境中执行时,会创建变量对象的一个“作用域链”
作用域的前端,始终是当前执行代码所在环境的变量对象
如果这个环境是函数,则将其活动对象作为变量对象
作用域链的用途:保证对执行环境有权访问的所有变量和函数的有序访问
标识符解析:沿着作用域链一级一级地搜索标识符的过程
搜索过程始终从作用域链的前端开始,然后逐级地向后回溯,直至找到标识符为止
d, 作用域链的前端始终是当前执行代码所在环境的变量对象,然后下一个变量对象来自包含(外部)环境,依次下去,一直延续到全局执行环境
1, 延长作用域链
a, 执行环境的类型只有两种-- 全局和局部(函数)
b, 在作用域链的前端“临时”增加一个变量对象,该变量对象会在代码执行后被移除
当执行流进入下列的任何一个语句后,作用域链就会得到加长:
try-catch 语句的catch块:创建一个新的变量对象,包含的是被抛出的错误对象的声明
with语句:会将指定的对象添加到作用域链中
2,没有块级作用域(见下)
a, 声明变量
使用var声明的变量会自动被添加到最接近的环境中
初始化变量没有使用var声明,该变量会自动被添加到全局环境
b, 查询标识符
搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符,如果到全局环境也没有找到对应的标识符,则意味着该变量未声明
*/
var color = 'blue';
function changeColor(){
var anotherColor = 'red';
function swapColors(){
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
}
swapColors();
}
changeColor();
// 因为以上存在3个执行环境(作用域),所以存在三个与之对应的“变量对象”,因为没有额外定义别的Object类型的对象,
// 所以,这三个变量对象都是“window对象”
// 以上代码包含3个执行环境:
// 全局环境
// changeColor()局部环境
// swapColors()局部环境
// 【注意】
// 1,内部环境可以通过作用域链访问所有的外部环境,而外部环境不能访问内部环境中的任何变量和函数
// 2,环境之间的联系是线性的、有次序的
// 没有块级作用域 --> 花括号封闭的代码块都有自己的作用域,即执行环境
// if (true){
// var color = 'blue';
// }
// alert(color);
// if语句中的变量声明会将变量添加到当前的执行环境(这里是全局环境)中
// 查询标识符
// var color = 'orange';
// function getColor(){
// return color;
// }
// alert(getColor());
// function getAA(){
// alert(aa);
// }
// var aa = 12;
// getAA();
// aa = 12;
// var aa = 13;
// alert(aa);
</script>
</head>
<body>
</body>
</html>