发表于: 2019-03-08 22:46:32
1 531
今天完成的事:
复习
明天计划的事:
复盘 复习
遇到的问题:
解决方案:
执行环境 定义了变量和函数有权限访问其它数据,决定了它们的各自行为。每个执行环境都有一个与之关联的变量对象,环境中定义的变量和函数都被保存在这个变量对象中。
“我们编写的代码无法访问这个对象,但解析器在处理数据时会在后台使用它”。当代码在一个执行环境中执行时,会创建变量对象的一个作用域链,作用域链的作用是保证执行环境有权访问所有变量和函数的有序访问。也可以把作用域链看做是一个集合,最前端的是当前的执行环境的对象,最后面的是全局执行环境的对象。如果环境是韩式,则将其活动对象作为变量对象,活动对象最开始只包含一个变量就是“arguments”对象(这个对象在全局环境中是不存在的)。
程序执行时,环境栈与执行环境的关系
当执行流进入一个函数时,即该函数正在执行,函数的执行环境就会被推入一个环境栈中,所有处在执行流的执行环境将有次序地保存在环境栈中,在函数执行之后,栈将其执行环境弹出,把控制权交给原来的执行环境。所以在程序执行中,环境栈是不断变化的,伴随着执行环境的出入,如下所示:
JavaScript中每个函数都会有一个Arguments对象的实例arguments,它引用着函数的实参,而且可以用数组下标的方式来引用arguments的元素。 arguments.length为函数实参的个数,要注意的是,arguments对象并不是一数组,它也不具有数组的所有方法,但是访问单个参数的方式与访问数组元素的方式相同
arguments 三个用处
5、可以使用callee属性调用自身。
会先在 with新添加的这个对象 b的执行环境中寻找a“678”,当找到了就不会再用函数li()执行环境中的a“th”
每个函数都有自己的执行环境,也就是局部执行环境,当执行流进入一个函数体时,函数的环境会被推入一个环境栈中,当函数执行之后,环境栈将其弹出。
作用域: 变量或方法有访问权限的代码空间,即变量或函数起作用的区域。(作用域包括全局作用域与函数作用域,没有块级块作用域,即一个变量的作用域不可能是一个块级域,至少包括最临近的整个函数空间。
作用域与变量对象,执行环境的关系
由定义可知,作用域即函数或变量的作用区域。
变量或函数具有作用域的原因,就是在环境中定义的变量仅保存在了该执行环境对应的对象变量中,执行环境在环境栈中弹出之后,作用域链中找不到该对变量对象,以下面为例
为什么在全局环境下showColor()内定义的变量不可访问呢,这是因为当函数执行到该语句时,color变量保存在了showColor()环境对应的变量对象中,现在showColor()已经执行完毕,该执行环境也从环境栈中弹出并销毁,所以此时的作用域链也不包括showColor()的执行环境对应的变量对象了,因为标识符解析是顺着作用域链查找变量的,所以这个过程不再能搜索到color变量,所以color变得只有定义该变量的函数中才能访问,具有一定范围的作用域。
评论