执行环境是javascript中最为重要的一个概念,执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为。
每个函数都有自己的执行环境。当执行流进入进入一个函数时,函数的环境就会被推入一个环境栈中,而在函数执行之后。栈将其环境弹出。将控制权返回给之前的执行环境。
demo 1
函数changerColor()作用域链包含两个对象(其中定义着arguments对象)和全局环境的变量对象。可以在函数内部访问变量color,就是因为在这个作用域链中可以找到它。
没有块级作用域
javascript没有块级作用域经常会导致理解上的困惑。例如,
demo 2
在javascript中,if语句中的变量声明会将变量添加到当前的执行环境,在使用for语句时尤其注意这一差异,
demo3
,此外,关于声明变量,
在使用var声明的变量会自动被添加到最接近的环境中。在函数内部最接近的就是函数的局部变量,在with语句中最接近的环境就是函数环境。如果初始化变量时没有使用var声明,该变量会自动被添加到全局环境。
demo 4
在以上代码中的函数add()定义了一个名为sum的局部变量,该变量包含加法操作的结果,虽然加过值从函数返回了,但变量sum在函数外面是访问不到的。如果省略了var关键字,那么如下:
这个例子中的变量sum在初始化赋值时没有使用var关键字。于是,当调用add()之后,添加到全局环境中的变量sum将继续存在,即使函数已经执行完毕,后面的代码依旧可以访问到。 在严格情况下应该使用关键字。
查询标识符:
当在某个环境中为了读取或写入而引用一个标识符时,必须通过搜索来确定该标识符合实际代码什么。搜索过程从作用域链的前段开始,向上级查询与给定名字匹配标识符。如果在局部环境中找到该标识符,搜索过程停止,变量就绪。如果在全局环境中也没有找到这个标识符,则意味着该变量尚未声明。
下图反应搜索检索过程: