1. // 变量
  2. var num = 12;
  3. let age = 24;
  4. // 常量
  5. const PI = 3.14;

块级作用域 重复定义 变量提升 作用域链
var
let
const

作用域

全局作用域

.js文件或者<script>标签中为全局作用域

局部作用域

在函数内部,循环,判断结构中为局部作用域

作用域链

内部作用域中的变量访问当前作用域如果没有该变量,则一层一层查找外层作用域中的变量,一层一层向上为作用域链

预解析

预解析会把 js 里面所有的 varfunction 提升到当前作用域的最前面
预解析分为:变量预解析(变量提升)函数预解析(函数提升)

变量提升

  1. console.log(num); // undefined
  2. var num = 10;

先收集var定义的变量或者函数,然后运行到变量赋值的位置时,该变量才会有值

函数提升

  1. fun();
  2. function fun() {
  3. console.log('可以先使用再声明');
  4. }

先收集 function 定义的函数,然后运行到调运函数的位置时,该函数才会被调用

  1. var fun = function () {}
  2. // 表达式定义的函数不能在定义前使用