作用域指的是:变量或函数的有效使用范围 有全局作用域域和局部作用域
(一)全局变量和局部变量
全局变量:直接在script标签下声明的变量 任何地方都能访问 任何地方都能对该值进行改变 局部变量:函数内部定义的变量 函数内能访问 出了函数括号就不能访问(垃圾回收)
1-全局变量或函数能在任何地方访问和修改
2-局部变量只能在函数内部访问
(二)预解析(变量提升)
浏览器在解析js代码的时候 会进行一个预解析的操作 会有一个js解析器(假设有的名字)里面会执行其中的两步 (不单单就这两步)
第一步 找一些东西(var function 参数) 第二步 逐行执行代码
比如 1- 找var 的时候 如果存在var关键字 则会将这个变量先存储下来 储存的形式为 var a =undefind 预解析的时候变量中存的就是undefind 等到逐行解析遇到表达式即 + - * % / -- = 等操作才会改变变量的值
上面的代码中 先找到var 存储a的值为undefined 所以打印的是undefined 然后再执行a=10
2- 找function 的时候 会将整个函数保存下来
上面的代码中 函数会整个存储下来 如果里面有注释的话 也会存储注释
3-找参数的时候 即执行函数时 函数内部可以看作为一个小小的区域 有自己预解析参数 就跟变量var一样
函数内部会进行一个跟外部一样的预解析 第一个a 在全局已经有变量 直接打印 a为10 剩下的就是局部变量 里面的打印第一个a会 往上面找 没有找到就是undefined 全局变量的第二个a赋值为20 下面的打印 a 找到变量就是20
详情为下图解释 如果全局中 var在打印的后面 则 前面所有打印找不到赋值 都为undefined