询问一个 JS 函数题

2021 年 2 月 14 日
 MLLB
var a = 10; {
    a = 99;

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

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

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

请问楼主你是什么学校?什么专业?
autoxbc
2021 年 2 月 14 日
@Caballarii #6 JavaScript 天天抄别人的语言特性,早晚会抄成最好的语言
deepall
2021 年 2 月 14 日
safari 30
chrome 99
哈哈哈
justin2018
2021 年 2 月 14 日
我这有的学校外聘老师讲课 讲一次课 1k 左右

一个月 几节课~
wish8023
2021 年 2 月 14 日
wish8023
2021 年 2 月 14 日
@wish8023
额,自己看调用栈吧!
https://sm.ms/image/JZmKwI8Pgu3pWBD
wish8023
2021 年 2 月 14 日
调用栈:
jinliming2
2021 年 2 月 15 日
IE 下、旧 IE 下打印的是 function a() { console.log(a); }:
https://i.loli.net/2021/02/15/S97y1WPJxCRlAj2.png
jinliming2
2021 年 2 月 15 日
但是添加 "use strict" 之后就打印 10 了:
![image.png]( https://i.loli.net/2021/02/15/erJPX7dDu35RVq1.png)
mxT52CRuqR6o5
2021 年 2 月 15 日
现在上学没办法,毕业之后不要太研究这种东西,不然就成孔乙己了
lixingjun
2021 年 2 月 15 日
实战中这种问题几乎碰不到,还是多实现一些确定的功能,代码水平才能真正进步
Roger006
2021 年 2 月 19 日
和朋友讨论调试后,对非严格模式下的结果有个猜测。修改原有代码为以下。都是在桌面 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://v2ex.ih06.com/t/753236

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

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

© 2021 V2EX