首页 > 编程知识 正文

js定义变量并赋值,var变量提升原理

时间:2023-05-06 11:48:48 阅读:14926 作者:951

提升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 ]

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。