[《Python编程思维》]加一Q一带一你10319281邀一情一玛33339333进【c9183.com】已助上千人成功翻盘,欢迎增加,沟通交流!(https://blog.csdn.net/nokiagu...!想学习的点进来

最近有学员给出一段令人匪夷所思的JavaScript代码(据说是某某大厂面试题),废话少说,上代码:

1.  var a = 10;    2.  {    3.      a = 99;    4.      function a() {    5.      }    7.      a = 30;    8.  }    9.  console.log(a);    

这段代码运行后果是99,也就是说,a = 99将a的值从新设为99,而因为前面应用a定义了一个函数,a = 30其实是批改的a函数,或者罗唆说,函数a将变量a笼罩了,所以在a函数的前面再也无奈批改变量a的值了,因为变量a曾经不存在了,ok,这段代码的输入后果如同能够解释得通,上面再看一段代码:

1.  var a = 10;    2.  {    3.      function hello() {    4.          a = 99;    5.          function a() {    6.          }    8.          a = 30;    9.      }    10.      hello();    11.  }    12.  console.log(a);    

大家能够猜猜,这段代码会输入什么后果呢?10?99?30?,答案是10。也就是说,hello函数压根就没有批改全局变量a 值,那么这是为什么呢?

依据咱们后面的论断,当执行到a = 99时,笼罩变量a的值,而后执行函数a的定义代码,接下来执行a = 30,将函数a改成了变量a,这个解释仿佛也没什么问题,然而,问题就是,与第1段代码的输入不一样。第1段代码批改了全局变量a的值,第2段代码没有批改全局变量a的值,这是为什么呢?

当初思考3分钟........

其实吧,别看这道题很简略,可能有很多程序员都能蒙对答案,反正就这几种可能,一共就3个数,蒙对的可能性是33.3333%,但如果让你具体解释其中的起因呢?这恐怕没有多少程序员能分明地解释其中的原理,当初就让我来给出一个浑然一体的解答:

只管后面给出的两段代码并不简单,但这外面暗藏的信息量相当的大。在正式解答之前,先给出一些知识点:

1. 执行级代码块和非执行级代码块

这里介绍一下两种代码块的区别:

执行级代码块,顾名思义,就是在定义代码块的同时就执行了,看上面的代码:

1.  {    2.        var a = 1;    3.        var b = 2;    4.        console.log(a + b);    5.  }    

这段代码,在解析的同时就会执行,输入3。

而非执行级代码块,就是在定义时不执行,只有在调用时才执行,很显然,函数代码块属于非执行级代码块,案例如下:

1.  function add()    2.  {    3.      var a = 1;    4.      var b = 2;    5.      console.log(a + b);    6.  }    

如果给执行级代码块套上一个函数头,就成了下面的样子,如果只有add函数,函数体是永远也不会执行的,除非应用上面的代码调用add函数。