V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
shpasspass
V2EX  ›  问与答

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

  •  
  •   shpasspass · 2018-11-22 19:23:44 +08:00 · 5070 次点击
    这是一个创建于 2194 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如图,


    奇怪了,if(false)应该没执行,但却改变了 a 的值,哪位大神帮忙讲解一下~
    11 条回复    2018-11-23 09:12:18 +08:00
    ipwx
        1
    ipwx  
       2018-11-22 19:26:23 +08:00
    用 let 不要用 var
    morethansean
        2
    morethansean  
       2018-11-22 19:27:15 +08:00 via Android   ❤️ 2
    变量提升。任何一个基础教程都会讲吧感觉?
    LancerComet
        3
    LancerComet  
       2018-11-22 19:30:27 +08:00   ❤️ 1
    var a = 1

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

    foo()
    rabbbit
        4
    rabbbit  
       2018-11-22 19:41:12 +08:00   ❤️ 3
    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
    shpasspass
        6
    shpasspass  
    OP
       2018-11-22 19:47:06 +08:00
    之前以为 if(false){}的话,计算机就不会去代码块里面,现在看来,是会进去的,只做变量提升而不执行
    多谢楼上各位
    xhyzidane
        7
    xhyzidane  
       2018-11-22 23:29:55 +08:00
    都在说变量提升,其实还有块级作用域的原因
    这里 var a = 2 的作用域就是函数 foo,foo 内部作用域的变量提升影响到了 console.log
    zjp
        8
    zjp  
       2018-11-22 23:39:01 +08:00 via Android
    @shpasspass 这是编译器干的活了
    di1012
        9
    di1012  
       2018-11-22 23:46:19 +08:00 via Android
    不是执行了,是初始化了
    FEDT
        10
    FEDT  
       2018-11-23 01:10:40 +08:00 via iPhone
    var 声明的再其词法作用域内生效
    66beta
        11
    66beta  
       2018-11-23 09:12:18 +08:00 via Android
    js 萌新?嘿嘿嘿,这才刚开始呢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   876 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:32 · PVG 04:32 · LAX 12:32 · JFK 15:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.