javaScript中的执行环境和作用域
执行环境
执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为。
每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
环境栈
每个函数都有自己的执行环境,当执行流进入一个函数的时候,函数的环境就会被推入环境栈中。
作用域链
当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。
标识符的解析是沿着作用域链一级一级的搜索标识符的过程。搜索过程始终从作用域链的前端开始,然后逐级地向后回溯,直到找到标识符为止。
对作用域的理解
要回答作用域的问题,首先就得说到执行环境,执行环境的定义了变量或函数有权访问其他的数据,决定了他们的行为,每个执行环境中又有一个与之关联的变量对象,
执行环境中定义的所有变量和函数都保存在这个对象之中,我们将全局执行环境中的变量对象定义为Window。这时候的全是环境中的执行变量也就是Window 就拥有一个全局作用域。
每个函数都有自己的执行环境,当执行流执行到这个函数的时候,函数的执行环境会被推入环境栈中,执行中的函数被称为活动对象,此时的执行环境对应的变量对象创建一个作用域链,一层,一层的往上
找,直到找到全局变量对象,也就是window。 此时函数中的变量对象包含的对象或函数就是局部作用域,形成执行流就是作用域链。说白了,执行环境就是作用域。