手机版

JavaScript中的标识符提升问题

时间:2021-09-09 来源:互联网 编辑:宝哥软件园 浏览:

JS中有变量提升。JS的设计其实是低劣的,或者是语言实现的副作用。它允许变量在没有声明的情况下被访问,或者在使用之前被声明。初学者对此很困惑,甚至很多使用JS多年的老手也很困惑。然而,在ES6加入let/const后,变量“提升”不复存在。

首先,变量是未声明的,直接使用

函数test(){ alert(not defined);} test();//?报告错误是很自然的

二.结尾的变量声明

函数test(){ alert(declaredButNotAssigned);//未定义的var declaredButNotAssigned} test();输出未定义,结果比前面的例子好,没有报错,代码可以运行,但是变量值可能不是程序员所期望的。

第三,变量在末尾声明,同时给变量赋值

函数测试(){ alert(declaredAndAssigned);//未定义的var declaredAndAssigned=1;} test();结果和两个一样。显然,1不会因为赋值而输出。

第二,第三,变量吊装已经发生,简单定义

变量提升:在指定的作用域中,先使用变量,然后按照代码顺序声明,但是运行时变量的可访问性提升到当前作用域的顶部,其值是未定义的,没有可用性。

我们在这里强调“代码顺序”和“运行顺序”,是因为我们写的大部分代码都是按顺序执行的,也就是“代码顺序”和“运行顺序”是一致的。这也符合人脑的思维过程。例如,有C语言经验的程序员

# include stdio . hint main(){ int x=1;printf('%d ',x);//1}两句代码,先声明整数x,然后输出。代码序列与运行序列一致,即运行正常。

如果顺序颠倒,

# include stdio . hint main(){ printf(' % d ',x);//错误int x=1;}此时,编译失败。但是JS可以反写,见二、三。

因此,有类似C语言经验的程序员非常清楚,变量在使用前需要声明,否则会报错。但是在JS中,有变量提升的现象,可以先用后声明。当在JS中使用C的经验时,就会出现混淆。

第四,函数表达式也有变量提升

函数test(){ alert(func);//未定义的var func=function(){ };} test();但是如果你想使用这个功能,那是不可能的

函数test(){ alert(func);//undefined func();//报告异常var func=function(){ };} test();因此,func是未定义的,调用func将报告异常。上述定义中提到的可访问性和可用性对应于以下陈述。

可访问性:alert(func),输出未定义,可以运行,可以访问func。

可用性:func(),报告异常,不能正常调用func,表示没有可用性。

第二个、第三个、第四个都是var声明的变量,JS中的函数声明会有改进,但是这个“变量”比较特殊,是函数类型(可以作为函数、方法或者构造函数)。它的名称(标识符)也被提升到当前范围的顶部。

5.函数声明的名称也将被提升到当前范围的顶部

函数测试(){ alert(f1);//函数f1();//'called '函数f1(){ alert(' called ');} }测试();我们可以看到,f1在代码末尾声明,f1之前使用,alert(f1)和f1()正常执行,表示可访问性和可用性。

前面说了,推广变量没用,属于语言的劣质设计。一个好习惯就是“先申报后使用”。这个特点也会出现在很多大公司的面试问题中

问题1:

//写出以下代码的运行结果:var a=1;函数fn() { if(!a){ var a=2;} alert(a);//?} fn();问题2:

//写出以下代码的运行结果:var a=1;函数fn(){ a=2;返回;函数a(){ } } fn();警报(a);//?但这一切都随着ES6中let/const的到来而结束。除了全局变量,在es中使用let/const。var被let取代后,变量提升将不复存在。

函数test(){ alert(declaredbutnotassigned 1);//报异常警报(declaredbutnotassigned 2);//报异常alert(func);//报异常让declaredButNotAssigned1让declaredButNotAssigned2=真让func=function(){ };} test();这强制程序员养成好的习惯,变量需要"先声明再使用",否则报错。

以下摘自MDN的关于让不在发生变量提升的描述

复制代码代码如下:在ECMAScript 6中,不要将变量提升到块的顶部。如果在遇到变量的让声明之前引用了块中的一个变量,这将导致一个参考错误,因为从块开始到声明处理完毕,该变量都处于"时间死区"。

用让声明变量后,类型也不再安全

if(条件){ alert(num的类型);//错误!设num=100}以前可以用typeof=='undefined ',来判断是否引入了某lib,比如jQuery

//判断jQuery是否引入了if (typeof $!=='未定义'){ //做某事}.jQuery没有引入,$ 没有声明,这句也不会报错而影响到下面的代码执行,但如果是让声明的就会报错了。

以上所述就是本文的全部内容了,希望大家能够喜欢。

版权声明:JavaScript中的标识符提升问题是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。