You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
var ball = 50
var water = 2
function school() {
var ball = 60
console.log(water) //2
console.log(ball) //60
function gym() {
var water = 3
console.log(water) //3
console.log(ball) //60
}
gym()
}
school()
console.log(water) //2
console.log(ball) //50
执行环境(execution context)
作用:定义了变量或函数有权访问的其他数据。
变量对象:每个执行环境都有一个与之关联的变量对象(variable object),执行环境中定义的所有变量和函数都保存在这个对象中。(我们无法访问,在解析器处理数据时会使用。感觉有点像全局执行环境中的windows)。
每次当控制器转到可执行代码的时候,就会创建一个环境,当所有代码执行完毕后,改环境被销毁,保存在其中的所有变量和函数定义也随之销毁。
全局执行环境
在浏览器中,全局执行环境被认为是window对象。
所有全局变量和函数都是作为window对象的属性和方法创建的。不过从 ES6 开始,新增了let 和 const 全局变量将逐步与顶层对象的属性脱钩。
函数执行环境
当执行流进入一个函数是,函数的环境就会被推入一个环境栈中。
在函数执行之后,栈将其环境弹出。
具体可看这么一个例子:
流程示意图
作用域
当代码在一个环境中执行时,会创建变量对象的一个作用域链。
用途:保证对执行环境有权访问的所有变量和函数的有序访问。
可以看这么一个例子
这个例子共涉及三个执行环境:全局环境、school()的局部环境、gym()的局部环境。在不同的环境中,都访问了water和ball的值,如何保证这些值能有序的访问就是作用域链的效果了 。
作用域链是由一系列变量对象组成,这个通道时候从左往右单项传递的。每个环境都可以向上搜索作用域链,以查询变量和函数,但不能向下进入另一个执行环境。所以在school中能访问到当前作用域的ball和上一级全局中的water,而gym中,访问到了当前作用域的water,就不会继续往上寻找。寻找ball时,当前作用域中没有,会寻找school中,找到了ball就不会继续往上寻找。
The text was updated successfully, but these errors were encountered: