var foo = 1;
function bar() {
foo = 10;
return;
function foo() {}
}
bar();
console.log(foo); //为什么是1而不是10
var foo = 1;
function bar() {
foo = 10;
return;
function foo() {}
}
bar();
console.log(foo); //为什么是1而不是10
貌似在js中会先处理变量的声明~~
所以运行到bar内部时,js会先调用foo的声明。
function bar() {
foo = 10;//再运行这一行
return;
function foo() {};//先运行这一行
}
等于说在bar中,foo其实指向的是function foo(){}
,而不是外面的foo
。
考试题有点扯淡,如果在生产中谁写出这样的代码肯定要拿回去重写的。
bar 方法是函数声明 会在执行前被 解析(hoisted), 存在于当前上下文的任意一个地方
var foo = 1;
function bar() {
foo = 10; #在此之前 由于下边的函数声明 已经存在一个名为 foo
return; #的局部变量
function foo() {}
}
bar();
console.log(foo);
9 回答9.5k 阅读
6 回答5.1k 阅读✓ 已解决
5 回答3.7k 阅读✓ 已解决
4 回答8.1k 阅读✓ 已解决
7 回答10.1k 阅读
5 回答8.3k 阅读
2 回答10.4k 阅读✓ 已解决
先分析一下每步流程:
第一步:var foo = 1;
全局变量foo被初始化赋值成1。
第二步:执行bar();方法。
第三步:bar()方法里,函数声明function foo(){}优先处理,这里JavaScript解析语法时(在运行之前)函数优先于一切。所以foo被初始化赋值为function(){};
第四步:执行foo = 10;这里制造了一个假象,认为没有用var 声明指向的是外层foo = 1;。其实不是。而是先在自身函数体里找有没有foo声明,找到之前声明的function foo(){};赋值成10,只是局部变量的值改写。
第五步:输出foo,这时找的是全局变量var foo = 1;输出1。