作用域
作用域(scope)规定了变量能够被访问的“范围”,离开了这个“范围”变量便不能被访问,作用域分为全局作用域和局部作用域。
全局作用域:函数外面的作用域
局部作用域:函数内部的作用域
函数作用域(局部作用域)
函数作用域 :在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。
1.函数内部声明的变量,在函数外部无法被访问
2.函数的参数也是函数内部的局部变量
3.不同函数内部声明的变量无法互相访问
4. 函数执行完毕后,函数内部的变量实际被清空了
块作用域
块作用域:在 JavaScript 中使用 {} 包裹的代码称为代码块,代码块内部声明的变量外部将【有可能】无法被访问,也就是说用{}包起来的代码块,就是块级作用域
1.let 声明的变量会产生块作用域,var 不会产生块作用域
2.const 声明的常量也会产生块作用域
3.不同代码块之间的变量无法互相访问
4.推荐使用 let 或 const
注:开发中 let 和 const 经常不加区分的使用,如果担心某个值会不小被修改时,则只能使用 const 声明成常量。
全局作用域
script 标签和 .js 文件的【最外层】就是所谓的全局作用域,在此声明的变量在函数内部也可以被访问。
1.为 window 对象动态添加的属性默认也是全局的,不推荐!
2.函数中未使用任何关键字声明的变量为全局变量,不推荐!!!
3.尽可能少的声明全局变量,防止全局变量被污染
4.JavaScript 中的作用域是程序被执行时的底层机制,了解这一机制有助于规范代码书写习惯,避免因作用域导致的语法错误。
总结
作用域:变量的使用范围
1.全局作用域:函数外部的作用域,在全局申明的变量称为全局变量,可以在任何地方使用
2.局部作用域:函数内部的作用域,在局部申明的变量称为局部变量,只能在当前作用域使用
3.块级作用域:大括号包裹的代码块,就是块级作用域
变量
变量:全局变量和局部变量
全局变量:在全局定义域定义的变量
局部变量:在局部定义域定义的变量,只能在函数中使用
var和let区别
1.var声明的变量不具有块级作用域,let具有
2.var声明的变量可以重新声明,let不可以
3.var声明变量,相当给window添加属性,let直接就是变量
4.var和let都可以只定义不赋值
const
const声明常量,其他与let一样
作用域链
作用域链本质上是底层的变量查找机制,在函数被执行时,会优先查找当前函数作用域中查找变量,如果当前作用域查找不到则会依次逐级查找父级作用域直到全局作用域
1.嵌套关系的作用域串联起来形成了作用域链
2.相同作用域链中按着从小到大的规则查找变量
3.子作用域能够访问父作用域,父级作用域无法访问子级作用域(就近原则)
闭包
闭包是一种比较特殊和函数,使用闭包能够访问函数作用域中的变量。从代码形式上看闭包是一个做为返回值的函数
1.闭包本质仍是函数,只不是从函数内部返回的
2.闭包能够创建外部可访问的隔离作用域,避免全局变量污染,能够是变量的作用范围延伸
3.过度使用闭包可能造成内存泄漏
4.回调函数也能访问函数内部的局部变量。(看的快吗,没懂啥意思,有空再研究)