询问一个 JS 函数题
var a = 10; { a = 99; function a() { console.log(a); } a = 30; } console.log(a);
如上,请问为什么最终的打印结果是 99 呢?
var a = 10; { a = 99; function a() { console.log(a); } a = 30; } console.log(a);
如上,请问为什么最终的打印结果是 99 呢?
我原以为 JS 里没有这种未定义行为 /依赖于解释器实现的行为,今天是长见识了。
这题的关键是作用域吧?把 var 换成 let 就能得到 10 了,还有那两括号是什么意思还没找到,但是去掉括号一行行执行结果是 30 的,具体为什么我也不清楚,第一次见这样写,我悟了
我服了 别出这种题目了行不行。。。。。。
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 下, 基本是写不出这么 “错误的” 代码的. 肯定会在写的时候报错.
非严格模式下的块级函数问题。
if 和 for 里面的实现取决于浏览器,参考
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/function#%E6%9C%89%E6%9D%A1%E4%BB%B6%E7%9A%84%E5%88%9B%E5%BB%BA%E5%87%BD%E6%95%B0
总的来说就像 10 说的,别这么用,要用就上匿名函数。
非要拿着旧时代的裹脚布狂舔,真的不恶心吗
请问主你是什么学校?什么专业?
一个月 几节课~