var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
console.log(a); //1
为什么不是10呢, 在function b中定义了一个function a, 怎么就能把a=10给冲掉呢, 这段代码的解析和执行顺序是怎么样的啊
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
console.log(a); //1
为什么不是10呢, 在function b中定义了一个function a, 怎么就能把a=10给冲掉呢, 这段代码的解析和执行顺序是怎么样的啊
function b() {
a = 10;
return;
function a() {}
}
当这段代码执行在实际运行过程中可以分为2个阶段,第一个阶段是代码的编译阶段,在这个阶段引擎会找到所有的声明,并关联作用域,这也是hoisting
发生的阶段,第二阶段是代码的执行阶段。
具体到上面的代码就是:在一个函数内,通过函数表达式的方式声明了函数a
: function a() {}
,编译阶段hoisting
。那么这个函数执行的时候就成这样了:
function b() {
function a(){};
a = 10;
return;
}
函数b
执行的时候,在它的作用域中有局部变量a
,因此并不会影响到外部的全局变量a
,所以最后console.log(a)
的时候仍然是输出的全局变量a
的值.
13 回答12.8k 阅读
7 回答1.9k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
6 回答872 阅读✓ 已解决
6 回答1k 阅读
2 回答1.3k 阅读✓ 已解决
function b() {
}
//由于函数声明提升,是这样的
function b(){
}