search

Home  >  Q&A  >  body text

javascript - js中变量提升问题

求问一道js的题

var name = 'World!';
(function () {
    if (typeof name === 'undefined') {
        var name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();

运行结果为什么是“Goodbye Jack”,即name是undefined

var name = 'World!';
(function () {
    console.log(name)
})();

却输出了name的值“World!”

明白了没注意if中的var name会进行变量声明提升,多谢大家了

阿神阿神2896 days ago250

reply all(4)I'll reply

  • PHPz

    PHPz2017-04-10 17:38:15

    变量声明提升的作用
    在一个函数体内声明的变量,JS解析器都会将其移动到函数体的顶部

    var name = 'World!';
    (function () {
        if (typeof name === 'undefined') {
            var name = 'Jack';
            console.log('Goodbye ' + name);
        } else {
            console.log('Hello ' + name);
        }
    })();

    等价为==>

    var name = 'World!';
    (function () {
        var name;    
        if (typeof name === 'undefined') {
            name = 'Jack';
            console.log('Goodbye ' + name);
        } else {
            console.log('Hello ' + name);
        }
    })();

    执行的时候有个变量查找的过程,如果在当前函数体内没找到,就会到定义的函数体的外层函数中去寻找,一直向上到全局对象中寻找,还是找不到就会报TypeError错误

    var name = 'World!';
    (function () {
        console.log(name)
    })();

    以上代码就表现为这种行为~~

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 17:38:15

    你的提问已经解答了啊,以下代码等价于你提问的代码

    var name = 'World!';
    (function () {
        var name;//undefined
        if (typeof name === 'undefined') {
            name = 'Jack';
            console.log('Goodbye ' + name);
        } else {
            console.log('Hello ' + name);
        }
    })();

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 17:38:15

    第一个等价于
    `

    var name // 此时name就是undefined 所以条件成立 进入if 赋值为  Jack ,这才是变量提升
    
    // 第二个js 运行后在当前作用域下找不到 name 向上级作用域查找  找到了  所以是  world
     if (typeof name === 'undefined') {
       name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }

    `

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 17:38:15

    为什么第二个不提升。第一个提升?
    因为js是函数级作用域。
    函数块内的所有变量都会把声明提到函数块内部的顶端。
    var v=3
    会提升var v
    所以alert v 会undefined

    而函数块内没有新变量声明。alert找不到v,就会往上翻。翻到函数块外面
    然后发现v的值。输出hello

    看懂了赞我

    reply
    0
  • Cancelreply