[《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 函数。