询问一个 JS 函数题

2021-02-14 00:52:04 +08:00
 MLLB
var a = 10; {
    a = 99;

    function a() {
        console.log(a);
    }
    a = 30;
}
console.log(a);

如上,请问为什么最终的打印结果是 99 呢?

3953 次点击
所在节点    JavaScript
37 条回复
across
2021-02-14 17:55:16 +08:00
这种题目拿来做分析理解其实没什么问题,可以认识到 js 的缺陷表现。
你不知道的 js 第一本有专区讲过这些问题
zhoudaiyu
2021-02-14 18:01:05 +08:00
int a = 5; a= ++++++a++++++++; cout << a;
cyberpoint
2021-02-14 18:01:35 +08:00
现在出这种题目的都是 NT
ttoott200
2021-02-14 18:28:49 +08:00
好神奇! a = 99 改变了全局变量 a,函数声明 function a() 相当于以 let 方式创建了一个局部变量 a,后面的 a = 30 改变了局部变量,不会影响到全局变量,最后输出的 a 是 99 。
Kininaru
2021-02-14 18:45:18 +08:00
如果我同事写这种代码给我看,我会考虑偷偷拔掉他的头发
AndyAO
2021-02-14 18:46:58 +08:00
学校里居然开始教 JavaScript 了 !

请问楼主你是什么学校?什么专业?
autoxbc
2021-02-14 19:04:44 +08:00
@Caballarii #6 JavaScript 天天抄别人的语言特性,早晚会抄成最好的语言
deepall
2021-02-14 20:06:25 +08:00
safari 30
chrome 99
哈哈哈
justin2018
2021-02-14 20:29:45 +08:00
我这有的学校外聘老师讲课 讲一次课 1k 左右

一个月 几节课~
wish8023
2021-02-14 20:39:21 +08:00
wish8023
2021-02-14 20:44:47 +08:00
@wish8023
额,自己看调用栈吧!
https://sm.ms/image/JZmKwI8Pgu3pWBD
wish8023
2021-02-14 20:47:33 +08:00
调用栈:
jinliming2
2021-02-15 00:25:34 +08:00
IE 下、旧 IE 下打印的是 function a() { console.log(a); }:
https://i.loli.net/2021/02/15/S97y1WPJxCRlAj2.png
jinliming2
2021-02-15 00:28:29 +08:00
但是添加 "use strict" 之后就打印 10 了:
![image.png]( https://i.loli.net/2021/02/15/erJPX7dDu35RVq1.png)
mxT52CRuqR6o5
2021-02-15 00:38:07 +08:00
现在上学没办法,毕业之后不要太研究这种东西,不然就成孔乙己了
lixingjun
2021-02-15 10:36:59 +08:00
实战中这种问题几乎碰不到,还是多实现一些确定的功能,代码水平才能真正进步
Roger006
2021-02-19 16:09:27 +08:00
和朋友讨论调试后,对非严格模式下的结果有个猜测。修改原有代码为以下。都是在桌面 chrome v88 测试出来的情况。
0.
1. var a = 10;
{
2. console.log(a);
3. a = 99;
4. function a(x) {}
5. a = 12;
6. function a() {}
7. a = 30;
8. console.log(a);
}
9.console.log(a);
代码运行到 [打断点地方]
0 位置,global=>a//undefined
1 位置 global => a//undefined
2 位置 g=>a//10 block=>a// function a(){}
3 位置 g=>a//10 block=>a// function a(){}
4 位置 g=>a//10 block=a//99
5 位置 g=>a//99 b=>a//99
6 位置 g=>a//99 b=>a//12
7 位置 g=>a//12 b=>a//12
8 位置 g=>a//12 b=>a//30
9 位置 g=>a//12

暂时的猜测是,非严格模式下的块儿内函数声明,会有提升覆盖,但运行到同名函数声明位置的时候,当前的同名变量的值会传递到全局

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/753236

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX