[《Python编程思维》]加一Q一带一你10319281邀一情一玛33339333进【c9183.com】已助上千人成功翻盘,欢迎增加,沟通交流!(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函数。