84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
var a = 1; function b() { a = 10; return; function a() {} } b(); console.log(a); //1
为什么不是10呢, 在function b中定义了一个function a, 怎么就能把a=10给冲掉呢, 这段代码的解析和执行顺序是怎么样的啊
原文在这:http://www.adequatelygood.com...
走同样的路,发现不同的人生
function b() {
a = 10; return; function a() {}
}//由于函数声明提升,是这样的function b(){
function a(){} a=10;/此时只是把b的函数作用域中的a赋值为10,并不会改变全局的变量 return
}
function b() { a = 10; return; function a() {} }
当这段代码执行在实际运行过程中可以分为2个阶段,第一个阶段是代码的编译阶段,在这个阶段引擎会找到所有的声明,并关联作用域,这也是hoisting发生的阶段,第二阶段是代码的执行阶段。
hoisting
具体到上面的代码就是:在一个函数内,通过函数表达式的方式声明了函数a:function a() {},编译阶段hoisting。那么这个函数执行的时候就成这样了:
a
function a() {}
function b() { function a(){}; a = 10; return; }
函数b执行的时候,在它的作用域中有局部变量a,因此并不会影响到外部的全局变量a,所以最后console.log(a)的时候仍然是输出的全局变量a的值.
b
console.log(a)
已解决, 谢谢大家, 还有一篇文章就是说这个的, 如下:https://segmentfault.com/q/10...
function b() {
}
//由于函数声明提升,是这样的
function b(){
}
当这段代码执行在实际运行过程中可以分为2个阶段,第一个阶段是代码的编译阶段,在这个阶段引擎会找到所有的声明,并关联作用域,这也是
hoisting
发生的阶段,第二阶段是代码的执行阶段。具体到上面的代码就是:在一个函数内,通过函数表达式的方式声明了函数
a
:function a() {}
,编译阶段hoisting
。那么这个函数执行的时候就成这样了:函数
b
执行的时候,在它的作用域中有局部变量a
,因此并不会影响到外部的全局变量a
,所以最后console.log(a)
的时候仍然是输出的全局变量a
的值.已解决, 谢谢大家, 还有一篇文章就是说这个的, 如下:
https://segmentfault.com/q/10...