shpasspass
V2EX  ›  问与答

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

  •  
  •   shpasspass · Nov 22, 2018 · 5772 views
    This topic created in 2758 days ago, the information mentioned may be changed or developed.
    如图,


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

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

    foo()
    rabbbit
        4
    rabbbit  
       Nov 22, 2018   ❤️ 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
       Nov 22, 2018
    之前以为 if(false){}的话,计算机就不会去代码块里面,现在看来,是会进去的,只做变量提升而不执行
    多谢楼上各位
    xhyzidane
        7
    xhyzidane  
       Nov 22, 2018
    都在说变量提升,其实还有块级作用域的原因
    这里 var a = 2 的作用域就是函数 foo,foo 内部作用域的变量提升影响到了 console.log
    zjp
        8
    zjp  
       Nov 22, 2018 via Android
    @shpasspass 这是编译器干的活了
    di1012
        9
    di1012  
       Nov 22, 2018 via Android
    不是执行了,是初始化了
    FEDT
        10
    FEDT  
       Nov 23, 2018 via iPhone
    var 声明的再其词法作用域内生效
    66beta
        11
    66beta  
       Nov 23, 2018 via Android
    js 萌新?嘿嘿嘿,这才刚开始呢!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2825 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 11:22 · PVG 19:22 · LAX 04:22 · JFK 07:22
    ♥ Do have faith in what you're doing.