变量名与函数名重复

今天遇到一道很有意思的题目

      console.log(c); 
      var c;
      function c(a) {
        console.log(a);   
        var a = 3;
        function a() {}
      }
      c(2);

 小伙伴们的答案是什么呢?

这就涉及到我们的函数和变量的预解析了

js‘从上到下运行’,但是可不是运行到哪才执行那一句语句。。

举个栗子:

(现在用let和const没这个问题,会直接报错)

console.log(a);

var a = 0;

输出undefined,而不是直接报错,为什么?

因为浏览器会预解析变量,也就是:

var a;

conso.log(a);

a = 0;

浏览器的预解析不止变量,还有函数声明

1)函数声明会置顶

2)变量声明也会置顶

3)函数声明比变量声明更置顶:(函数在变量上面)

4)变量和赋值语句一起书写,在js引擎解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置

5)声明过的变量不会重复声明

 注意:函数变量在下面重新赋值的话会覆盖掉函数声明(只声明就不会,栗子:var obj;)

function obj(){
  console.log('函数声明')
}
var obj = 'test'
obj()       // 报错,obj is not a function

说了那么多废话,上面那个才是关键,函数声明的等级高于变量声明,所以上面那道题可以解释为:

     function c(a) {
       function a() {}
       var a;
       console.log(a);   
       a = 3;
     }  
     var c;
     console.log(c); 
     
     c(2);

好了,就这样....

原文地址:https://www.cnblogs.com/vokiinnn/p/13152708.html