js 执行环境及作用域

     执行环境是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将继续存在,即使函数已经执行完毕,后面的代码依旧可以访问到。 在严格情况下应该使用关键字。

查询标识符:

当在某个环境中为了读取或写入而引用一个标识符时,必须通过搜索来确定该标识符合实际代码什么。搜索过程从作用域链的前段开始,向上级查询与给定名字匹配标识符。如果在局部环境中找到该标识符,搜索过程停止,变量就绪。如果在全局环境中也没有找到这个标识符,则意味着该变量尚未声明。


下图反应搜索检索过程:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值