javascript——执行环境和作用域

先来明白几个概念:

执行环境:有时候也叫环境,定义了变量和函数有权访问的其它数据,决定了他们各自的行为。每一个指定环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。

全局执行环境是最外围的一个执行环境,在Web浏览器中,被认为是window对象,每个函数都有自己的执行环境,每当执行流进入一个函数的时候,函数的环境将会被推入一个栈中,函数执行完成后,栈就被弹出,理解栈也就能理解,所以内部可以向*问外部,外部不能向下访问内部。

当代码在一个环境中执行的时候,就会创建作用域链,保证对执行环境有权访问所有变量和函数的有序访问。全局执行环境的变量对象始终都是作用域中的最后一个对象。(个人理解:可以把作用域链想象成一条链子,链子都是通过环境对象连接起来,末端就是全局对象,最前端就是当前执行的代码所在的环境对象,为什么是一条链子呢,就是我这没有的东西,属性等,可以向链子的后端去追溯访问)当然找不到,就报错呗!找到了就停止。

自己根据自己理解,画了一个草图,有问题很开心沟通交流

javascript——执行环境和作用域

函数中称为活动对象,因为在函数执行上下文中,变量对象是不能直接访问的,此时由**对象扮演变量对象,**对象是在进入函数上下文中被创建的,通过函数的arguments属性初始化。

javascript——执行环境和作用域

这几个属性和属性吧,对于函数来说。这就是**对象内部的属性。

对于整个的创建流程,需要清楚一下呢:

1、首先根据函数的参数,创建并初始化arguments object

2、查找函数声明,将函数引用保存到变量对象,或者对于函数来说的**对象里面,后来居上,如果已经存在就覆盖。

3、查找变量声明,自动初始化为undefined。

 

执行环境和作用域链的区别和联系:

 

执行环境有全局执行环境和局部执行环境(也就是函数执行环境)

作用域链是由多个执行环境的变量对象共同组成的。对象对象对象组成!! 那么作用域就是一个个变量对象了

当代码在一个环境中执行的时候,会创建变量对象的作用域链。

在javascript中,没有块级作用域,更没有对象作用域,with语句逆天除外,但是在开发大型应用程序会导致性能降低,加大代码调试难度,不建议使用。

所以Javascript中就两种作用域:全局作用域和函数作用域

记住变量提升的东西!

this:指向一个对象,就是一个普通的可以访问的对象。

好文: 

    执行上下文:http://www.cnblogs.com/wilber2013/p/4909430.html