javascript - js中变量提升问题
阿神
阿神 2017-04-10 17:36:15
0
4
254

求问一道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会进行变量声明提升,多谢大家了

阿神
阿神

闭关修行中......

Antworte allen(4)
PHPzhong

变量声明提升的作用
在一个函数体内声明的变量,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)
})();

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

刘奇

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

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

第一个等价于
`

var name // 此时name就是undefined 所以条件成立 进入if 赋值为  Jack ,这才是变量提升

// 第二个js 运行后在当前作用域下找不到 name 向上级作用域查找  找到了  所以是  world
 if (typeof name === 'undefined') {
   name = 'Jack';
    console.log('Goodbye ' + name);
} else {
    console.log('Hello ' + name);
}

`

大家讲道理

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

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

看懂了赞我

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage