在JavaScript中会存在一些这样的现象:一个变量在声明之前就可以访问而没有抛出异常,一个函数在声明之前就调用了,也没有抛出异常。

这就涉及到变量或者函数提升

作用域

全局作用域、函数作用域和块作用域。

如果变量定在全局作用域中,那么在审核位置都可以访问该变量;

如果变量定义在函数作用域内,那么只能在该函数内访问变量;

同理,定义在一个代码块中的变量,也就只能在该代码块中访问变量;

块级作用需要使用特定的let或者const关键字定义变量。

变量提升

变量声明会被提升到函数的顶部位置,但是赋值并未提升。【变量提升情况只能出现在var声明的变量】

  1. var a = "90";
  2. (function(){
  3. console.log(a)
  4. })()
  5. var b = "78";
  6. (function(){
  7. console.log(b);
  8. var b = 9000
  9. })()

函数提升

同样的道理,使用函数声明方式定义函数,也会出现函数提升的情况。如下代码段:

  1. show();
  2. var show;
  3. function show(){
  4. console.log("90")
  5. }
  6. show = function(){
  7. console.log(76)
  8. }

函数的提升,会将整个函数体一起提升