提升js变量和提升函数的详细过程先看两个板栗,下面两个代码分别输出什么?
//代码段1功能foo ({ vara=1; 函数({ } console.log ) ) a; (foo ); //代码段2function foo () { var a; 函数({ } console.log ) ) a; (foo ); 答案是代码段1打印1,代码段2打印a (函数。
为什么会这样呢? 这关系到js中变量的提高和函数的提高的具体过程。
1、变量升级js是怎么做变量的呢?
如下面的代码所示
var a=1; var b=2; js在解析上面的代码时,实际上解析如下:
var a; var b; a=1; b=2; 所以js在我们定义一个变量时,并不是声明完成后立即赋值,而是声明所有要使用的变量后,去变量的定义那里赋值。 变量声明的过程是变量的升级。
现在,让我们来看看下一个板栗:
function foo () { var a=1; 控制台. log (a; 控制台. log (b ); var b=2; (foo ); 上面的代码在js眼里是这样分析的:
function foo () { var a; var b; a=1; 控制台. log (a; //1控制台. log (b );//未定义b=2; (foo ); 因此,输出的a的值是1,b的值是未定义的。
当变量声明升级时,它将全部升级到范围的开头,然后一个接一个地上升。 但是,向变量赋值时,并不是一个接一个地赋值,而是将值赋给变量原来定义的位置。 本来,js定义变量的地方,只有在js运行到这一步后,才会进行赋值操作。 未执行的变量不进行赋值操作。
因此,变量升级、升级是变量的声明,而不是变量的赋值。
2、函数升级函数升级与变量升级类似,升级到作用域的第一个位置。 但是,变量的升级分为两个阶段,第一步是变量声明的升级,第二步是变量的赋值。 另一方面,函数的提升是将整个函数直接提升到作用域的最初位置,相当于剪切过去的样子。
3、变量升级和函数升级的顺序在范围内,无论是变量还是函数都要升级到范围的第一个位置。 不同的是,函数上升后的位置在变量上升后的位置之后。
板栗:
下面的代码输出什么?
功能foo () console.log ) ) a; var a=1; 控制台. log (a; 函数({ } console.log ) ) a; (foo ); 上面的代码在js眼里是这样分析的:
function foo () { var a; 函数({ } console.log ) ) a; //a(a=1; 控制台. log (a; //1控制台. log (a; //1 ) foo ); 因此,从上面的栗子中可以看到,变量升级在函数升级之前,但变量赋值的部分从js原型到变量定义的位置都被赋值给变量,而函数升级相当于直接切到开头。
让我们来看看更复杂的板栗:
功能foo () console.log ) ) a; var a=1; 控制台. log (a; 函数({ } console.log ) ) a; 控制台. log (b ); var b=2; 控制台. log (b ); 功能b ({ } console.log ) ) b; } js这样分析:
function foo () { var a; var b; functiona { } function b { } { }控制台. log { a }; //a(a=1; 控制台. log (a; //1控制台. log (a; //1控制台. log (b ); //b(b=2; 控制台. log (b ); //2控制台. log (b ); //2 ) foo );最后,注意:只有声明的变量和函数才会进行提升,隐式全局变量不会提升。
在下一个栗子中,b不进行变量的提升。
功能foo () console.log ) ) a; 控制台. log (b ); //报告错误的b='aaa '; var a='bbb '; 控制台. log (a; 控制台. log (b ); (foo ); 4、参考js变量升级与函数升级链接的机制: https://segment fault.com/a/119000008568071
[转载地址] 65https://www.cn blogs.com/lvo nve/p/9871226.html ]