全局作用域:
- window对象下的
- 是最大的作用域
- 其他的作用域 都必须在全局作用域下
局部作用域:
- 因为函数体中有声明的变量 函数在执行的时候,该变量运行需要一个环境,所以就产生了局部作用域
- 当函数执行完毕的时候,看子作用域是否有需要使用 他声明的变量 如果没有则消失,则作用域销毁 变量消失(实际为变量赋值null),如果用到了 就形成了闭包 作用域会保存下来
- 函数的执行环境 在栈内存中 每次执行都是开辟一个空间 执行完毕消失
- 在函数局部作用域中最大的对象叫 Ao对象, Ao对象会随着作用域的存在而存在
- 所以 每个作用域中都会有一个最大的对象, 局部作用域为Ao对象 全局为go对象
- 每个对象当中 都隐藏this 默认指向该对象(抽象的对象)
块级作用域
1: let声明的变量 因为{} 是一个代码块 在{}内部 let只能在自己的{}中进行运行,外部不能访问 所以是块级作用域 只看{} 不看函数
- 2: 块级作用域也遵循作用域规则,小作用域中可以使用大作用域中的变量
- 3: for 循环中 let 千万注意! ??? 不是一个块级域
- 案例如下:
for(let i = 0; i<3; i++) {
setTimeOut(function(){
console.log(i)//0 1 2 不是 333
},1000)
}
for(var i = 0; i<3; i++) {
//循环先执行 异步后执行 循环执行完毕 i = 3
setTimeOut(function(){
console.log(i)//3 3 3 使用是全局变量 i=3
},1000)
}