1.执行环境
执行环境有全局执行环境(也称全局环境)和函数执行环境之分。
执行环境如其名是在运行和执行代码的时候才存在的,所以我们运行浏览器的时候会创建全局的执行环境,在调用函数时,会创建函数执行环境。
1.1全局环境
全局执行环境是最外围的一个执行环境,在web浏览器中,我们可以认为他是window对象,因此所有的全局变量和函数都是作为window对象的属性和方法创建的。代码载入浏览器时,全局环境被创建,关闭网页或者关闭浏览时全局环境被销毁。
1.2函数执行环境
每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就被推入一个环境栈中,当函数执行完毕后,栈将其环境弹出,把控制权返回给之前的执行环境。
2 作用域、作用域链
2.1 全局作用域(globe scope)和局部作用域(local scope)
全局作用域和局部作用域中变量的访问权限,其实是由作用域链决定的.
每次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链。
作用域链是函数被创建的作用域中对象的集合。
作用域链可以保证对执行环境有权访问的所有变量和函数的有序访问。
作用域链的最前端始终是当前执行的代码所在环境的变量对象(如果该环境是函数,则将其活动对象作为变量对象),下一个变量对象来自包含环境(包含当前还行环境的环境),下一个变量对象来自包含环境的包含环境,依次往上,直到全局执行环境的变量对象。全局执行环境的变量对象始终是作用域链中的最后一个对象。
1.函数的局部环境可以访问函数作用域中的变量,也可以访问和操作父环境(包含环境)乃至全局环境中的变量。
2.父环境只能访问其包含环境和自己环境中的变量和函数,不能访问其子环境中的变量和函数。
3.全局环境只能访问全局环境中的变量和函数,不能直接访问局部环境中的任何数据。
3.作用域提升
3.1 变量提升
var name="haha"; 2 function changeName(){ 3 console.log(name); 4 var name="xixi"; 5 } 6 changeName(); 7 console.log(name); 输出:undefined 和 haha
var name="haha"; 2 function changeName(){ 3 var name; 4 console.log(name); 5 name="xixi"; 6 } 7 changeName(); 8 console.log(name); 相当于上面代码的解释,变量提升
3.2函数提升
在JavaScript中函数的创建方式有三种:函数声明(静态的,像函数example1()的形式)、函数表达式(函数字面量)、函数构造法(动态的,匿名的)。
函数表达式:
var func1 = function(n1,n2){ 2 //function body; 3 };
函数构造法:
var func2 = new Function("para1","para2",...,"function body");
函数声明:
//函数声明 function myTest1(){ func(); function func(){ console.log("我可以被提升"); } } myTest1();
输出:我可以被提升 //函数表达式 function myTest2(){ func(); var func = function(){ console.log("我不能被提升"); } } myTest2();
输出:object expected