您的位置:首页 > Web前端 > JavaScript

javascript——执行环境和作用域

2018-03-22 20:28 405 查看
先来明白几个概念:

执行环境:有时候也叫环境,定义了变量和函数有权访问的其它数据,决定了他们各自的行为。每一个指定环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
全局执行环境是最外围的一个执行环境,在Web浏览器中,被认为是window对象,每个函数都有自己的执行环境,每当执行流进入一个函数的时候,函数的环境将会被推入一个栈中,函数执行完成后,栈就被弹出,理解栈也就能理解,所以内部可以向上访问外部,外部不能向下访问内部。
当代码在一个环境中执行的时候,就会创建作用域链,保证对执行环境有权访问所有变量和函数的有序访问。全局执行环境的变量对象始终都是作用域中的最后一个对象。(个人理解:可以把作用域链想象成一条链子,链子都是通过环境对象连接起来,末端就是全局对象,最前端就是当前执行的代码所在的环境对象,为什么是一条链子呢,就是我这没有的东西,属性等,可以向链子的后端去追溯访问)当然找不大,就报错呗!找到了就停止。
函数中称为活动对象,因为在函数执行上下文中,变量对象是不能直接访问的,此时由激活对象扮演变量对象,激活对象是在进入函数上下文中被创建的,通过函数的arguments属性初始化。



这几个属性和属性吧,对于函数来说。这就是激活对象内部的属性。
对于整个的创建流程,需要清楚一下呢:
1、首先根据函数的参数,创建并初始化arguments object2、查找函数声明,将函数引用保存到变量对象,或者对于函数来说的激活对象里面,后来居上,如果已经存在就覆盖。3、查找变量声明,自动初始化为undefined。

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

执行环境有全局执行环境和局部执行环境(也就是函数执行环境)
作用域链是由多个执行环境的变量对象共同组成的。对象对象对象组成!! 那么作用域就是一个个变量对象了
当代码在一个环境中执行的时候,会创建变量对象的作用域链。
在javascript中,没有块级作用域,更没有对象作用域,with语句逆天,除外,但是在开发大型应用程序会导致性能降低,加大代码调试难度,不建议使用。
所以Javascript中就两种作用域:全局作用域和函数作用域
记住变量提升的东西!
this:指向一个对象,就是一个普通的可以访问的对象。
好文: 
    执行上下文:http://www.cnblogs.com/wilber2013/p/4909430.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息