js 里, if(false){}似乎执行了,为什么?

2018-11-22 19:23:44 +08:00
 shpasspass
如图,


奇怪了,if(false)应该没执行,但却改变了 a 的值,哪位大神帮忙讲解一下~
5103 次点击
所在节点    问与答
11 条回复
ipwx
2018-11-22 19:26:23 +08:00
用 let 不要用 var
morethansean
2018-11-22 19:27:15 +08:00
变量提升。任何一个基础教程都会讲吧感觉?
LancerComet
2018-11-22 19:30:27 +08:00
var a = 1

function foo () {
var a = undefined
if (false) {
a = 2
}
console.log('a:', a)
}

foo()
rabbbit
2018-11-22 19:41:12 +08:00
js 在进入函数时时会把 var 声明的变量提升到顶部

function 中的所有 var 变量, function 声明的函数, 传进来的参数都会绑定到一个 Environment Record 上
执行函数内部代码前,有一步叫 Declaration Binding Instantiation
http://ecma-international.org/ecma-262/5.1/#sec-10.5
注意步骤 8,遍历代码,把所有 var 参数名绑定到 Environment Record,赋值为 undefined
rabbbit
2018-11-22 19:42:48 +08:00
shpasspass
2018-11-22 19:47:06 +08:00
之前以为 if(false){}的话,计算机就不会去代码块里面,现在看来,是会进去的,只做变量提升而不执行
多谢楼上各位
xhyzidane
2018-11-22 23:29:55 +08:00
都在说变量提升,其实还有块级作用域的原因
这里 var a = 2 的作用域就是函数 foo,foo 内部作用域的变量提升影响到了 console.log
zjp
2018-11-22 23:39:01 +08:00
@shpasspass 这是编译器干的活了
di1012
2018-11-22 23:46:19 +08:00
不是执行了,是初始化了
FEDT
2018-11-23 01:10:40 +08:00
var 声明的再其词法作用域内生效
66beta
2018-11-23 09:12:18 +08:00
js 萌新?嘿嘿嘿,这才刚开始呢!

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

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

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

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

© 2021 V2EX