var foo = 1;
function bar () {
if (!foo) {
var foo = 10;
}
console.log(foo);
}
bar();
var foo = 1;
为什么if里面的变量foo会提升到bar的顶端?if里面不是一个作用域吗?
var foo = 1;
function bar () {
if (!foo) {
var foo = 10;
}
console.log(foo);
}
bar();
var foo = 1;
为什么if里面的变量foo会提升到bar的顶端?if里面不是一个作用域吗?
这个问题牵扯到作用域/作用域链 和 JS变量声明提前;
JS变量声明提前:变量声明会提前到对应作用域的最前面执行;
ES6中有块级作用域声明 let
;var foo = 10;
其实是两个步骤var foo;foo=10;
,并且var foo;
变量声明会先于此作用域的其他代码执行;
这就是为什么下面这段代码
console.log(a);
var a=1;
js不报错,并打印出来的值是undefined
;
你问题中代码的执行顺序其实是
var foo = 1;
function bar () {
var foo;
if (!foo) { //foo为undefined
foo = 10;
}
console.log(foo);
}
bar();
var foo = 1;
10 回答11.2k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
这么说吧. javascript只有三种作用域:
全局作用域
function 制造的作用域
with 制造的作用域