四、作用域
4.1 作用域划分
4.2 作用域的规则
4.2.1 访问规则
作用域是控制变量的使用范围,对变量的操作有两种: 使用变量和给变量赋值。使用变量就是访问变量。
var a = 133;
function demo() {
console.log(a);
}
作用域内的变量不可以被作用域外访问。但是作用域内可以使用作用域外的变量。
先查看当前作用域中有没有声明过这个变量 如果有就直接用 如果没有 会向上层作用域去找 有就用,没有就继续向上 重复这个过程 直到找到变量或者到了全局发现全局依然没有这个变量 此时会报错
4.2.2 赋值规则
给变量赋值
function demo() {
a = 2333;
}
console.log(a) // 2333
给变量赋值的时候,会遵守以下规则:
先查看当前作用域中有没有声明过这个变量 如果有就直接赋值 如果没有 会向上层作用域查找 如果有就修改这个作用域中的变量 如果没有继续向上 重复这个过程 直到找到变量 或者到了全局依然没有 此时不会报错,而是会悄悄地把它注册为全局变量
4.3 声明提升
声明提升:是指在预解析的过程中,把变量、函数声明提升到作用域的最开头
函数声明是把函数整个提升到作用域的最开头 函数表达式与变量声明仅仅把变量的声明提升上去 没有提升赋值
预解析也会发生在函数作用域中
fun();
function fun() {
console.log(1)
}
fun();
//经过预解析之后
//代码会变成
function fun() {
console.log(1)
}
fun();
fun();