JS变量声明和函数声明的优先级

2019-04-12  本文已影响0人  如果俞天阳会飞
 console.log(a) // 函数
  var a = 1;
  console.log(a) //变量 1
  function a() {
  }
  console.log(a) //变量 1

函数提升优先与变量提升要高,且不会被变量声明覆盖,但是会被变量赋值覆盖 .比如对上面代码进行改进

 console.log(a) // 函数
  var a ;
  console.log(a) // 函数
  function a() {
  }
  console.log(a) // 函数

下面的一个例子

function b(){
     a = 10;
     return;
     function a(){    //函数声明置顶
       console.log(a);
     }
   }
   var a;
   a  = 1;
   b();
   console.log(a); // 输入1

我想大家都明白,在执行函数b的时候,由于其内部有一句a=10,前面并没有var,所以在执行完函数b之后,认为变量a提升为全局变量,并且10这个值覆盖了之前的1。所以打印出的值为10。但其实并不是这样,输出的反而是1,应为在函数b中有个a函数

当不给变量a赋值的时候,反而输出的都是函数而不是undefined

 function b(){
     a = 10;
     return;
   }
   b();
   console.log(a); // 10

在执行函数b的时候,发现有一个隐式声明a=10,它在函数b里的作用域中查找不到有关于名为a的地址,于是向外查找,发现全局作用域下也没有,那么变量提升,系统默认给变量a提供一个内存,并将值赋值给变量a,所以变量a变量提升为全局变量了。所以打印出的值为10

上一篇 下一篇

猜你喜欢

热点阅读