询问一个 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 呢?

3937 次点击
所在节点    JavaScript
37 条回复
xy90321
2021-02-14 01:11:17 +08:00
变量作用域往上找,找到啥就是啥。
另外你什么浏览器跑的是 99 ?
dousha99
2021-02-14 01:40:24 +08:00
@xy90321 在 NodeJS 15.8.0 的 REPL 里测试,确实输出 99. Firefox 85 下测试结果为 10.

我原以为 JS 里没有这种未定义行为 /依赖于解释器实现的行为,今天是长见识了。
wunonglin
2021-02-14 02:10:20 +08:00
写得太骚了。

这题的关键是作用域吧?把 var 换成 let 就能得到 10 了,还有那两括号是什么意思还没找到,但是去掉括号一行行执行结果是 30 的,具体为什么我也不清楚,第一次见这样写,我悟了
lichdkimba
2021-02-14 02:19:23 +08:00
firefox 10 chrome 99

我服了 别出这种题目了行不行。。。。。。
Building
2021-02-14 02:28:11 +08:00
请问有什么需求要求一定要这样写吗?写个代码都搞得跟八股文似的。
Caballarii
2021-02-14 02:38:28 +08:00
js 是世界上最好的语言
POPOEVER
2021-02-14 03:02:15 +08:00
{} 的写法相当于 var
kaiki
2021-02-14 03:11:34 +08:00
自从我知道不同浏览器的 JS 代码有不同的支持的时候,就不会去写这种花里胡哨的代码了。
能跑出一样的结果就行,反正是在客户的机子上跑,又不占我服务器,效率低点就低点。
mrochcnnnnn
2021-02-14 03:29:19 +08:00
@Caballarii 😂😂😂😂论坛气氛组就位,Java 不服
iugo
2021-02-14 09:31:09 +08:00
```js
var a = 10;

for (let i = 0; i < 1; i++) {
a = 99;

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

a = 30;
}

console.log(a);
```

这样看我们就容易接受一点.

我预期应该是返回 10 的, 之所以返回 99 可能和 V8 在作用域内没有函数声明进行提升有关.

刚好, 我们要强调, 在写 JS 的时候有如下要注意:

1. 在函数声明时, 避免重名.
2. 函数声明时, 尽量在顶级, 否则使用箭头函数.

在 ESLint 下或者 TypeScript 下, 基本是写不出这么 "错误的" 代码的. 肯定会在写的时候报错.
across
2021-02-14 10:03:34 +08:00
看结果明白为什么(同名函数区域覆盖)。
不过具体规则懒得找了,现在都用 let 而且搞同名写法也会被骂的...
oott123
2021-02-14 11:14:36 +08:00
finalwave
2021-02-14 11:38:27 +08:00
Sample
2021-02-14 11:59:05 +08:00
新时代八股
大清早就亡了
es2020 都来了
let 也可以考察作用域
该公司的代码难道也这样写吗?
茴香豆的茴字就贵公司知道有四种写法?

非要拿着旧时代的裹脚布狂舔,真的不恶心吗
f0rger
2021-02-14 13:04:49 +08:00
第一眼也是应该不是 99
我逆向推,得到 across 的答案。
不过这写法真的是吐了……
crab
2021-02-14 13:37:55 +08:00
@lichdkimba C 中的 多次++ -- 😭
DOLLOR
2021-02-14 16:53:04 +08:00
尽量用函数表达式 const func = ()=>{...},而不是函数声明 function func(){...}
rodrick
2021-02-14 17:04:36 +08:00
别搞这种题了。。真的累
MLLB
2021-02-14 17:33:39 +08:00
@lichdkimba 我也实属无奈。要做。
MLLB
2021-02-14 17:34:11 +08:00
@Building 可以理解为学校的题目。

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

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

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

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

© 2021 V2EX