关于javascript执行顺序、变量提升、作用域的问题

阅读() @2018-10-29 18:16:06
var a = 1;
var b = 2;
function fn(){
	a = 10;
	b = 20;
	return;
	function b(){}
}
fn();
alert(a+b);

js在执行代码的时候,遵循的顺序是“从上到下执行,但是执行之前先定义”:

第一步:定义变量a

第二步:定义变量b

第三步:fn函数声明

第四步:把1复制给a

第五步:把2赋值给b

第六步:执行函数fn

函数fn内部有b函数,所以优先声明b函数(相当于var b = function(){}),然后把10赋值给全局变量a,把20赋值给局部变量b。(在函数域里定义一个变量时,函数执行时内部的变量声明会提升至第一句,赋值则不会变,如果这个变量位于引用这个变量的语句的后面,那么引用的值就是undefined)。

第七步:执行alert,因为fn函数内部的局部变量b访问不到,所以在全局作用域下,b=2,a=10,最后的结果是12。

注意:定义一个函数,比如function fn(){},也就是声明了一个fn变量,只不过这个变量指向的是堆内存中的函数对象,function fn(){}是函数声明,var a = function(){}是函数表达式,两者之间稍有不同,就是定义和执行顺序!

推荐阅读JavaScript回调函数、作用域、变量提升

JavaScript面试题(闭包+作用域+变量提升

微信二维码