Heim > Fragen und Antworten > Hauptteil
求问一道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会进行变量声明提升,多谢大家了
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)
})();
以上代码就表现为这种行为~~
怪我咯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);
}
})();
伊谢尔伦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);
}
`
大家讲道理2017-04-10 17:38:15
为什么第二个不提升。第一个提升?
因为js是函数级作用域。
函数块内的所有变量都会把声明提到函数块内部的顶端。
var v=3
会提升var v
所以alert v 会undefined
而函数块内没有新变量声明。alert找不到v,就会往上翻。翻到函数块外面
然后发现v的值。输出hello
看懂了赞我