摘要:,此时变量的值为。其实关键点就在于,由关键字声明的变量是在编译阶段声明的,所以会出现变量提升的情况。但是编译器对语法中的和关键字声明的变量则不会提前声明,所以不会出现变量提升。
当程序执行这一段代码时
console.log(a); var a = 2;
有经验的同学都知道控制台会输出undefined而不是报错a is not defined
这是因为此时发生了变量提升,代码可以理解为以下形式
var a; console.log(a);// undefined a = 2;
这是为什么呢,让我先说明以下几点
一段JavaScript代码,是先由编译器编译成可执行代码,再交给引擎去执行的。
用var关键字声明的变量是在编译阶段声明的。
每当编译器遇到var xxx,都会去查找当前作用域是否已存在变量xxx,如果xxx已存在,则忽略该声明,反之,在当前作用域声明变量xxx。
所以当成程序执行下面代码时
console.log(a); var a = 2;
首先编译器查找当前作用域是否存在变量a,发现a并不存在,声明变量a。
再由引擎执行由编译器生成的代码console.log(a),此时变量a已经被编译器声明,但是还未被赋值,所以此时控制台输出的值是undefined。
a = 2,此时变量a的值为2。
其实关键点就在于,由var关键字声明的变量是在编译阶段声明的,所以会出现变量提升的情况。
但是编译器对ES6语法中的const和let关键字声明的变量则不会提前声明,所以不会出现变量提升。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/100159.html
摘要:编译原理在传统编译语言的流程中,程序中的一段源代码在执行之前会经历三个步骤,统称为编译。定义声明是在编译阶段进行的,而赋值是在执行阶段进行的。 编译原理 在传统编译语言的流程中,程序中的一段源代码在执行之前会经历三个步骤,统称为编译。 词法分析将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代码块被称为词法单元(token)。 语法分析这个过程是将词法单元流(数组)转...
摘要:殊不知不只有声明才会提前,以这种形式声明的函数,会被提升到作用域的最最顶部,然后再是变量的提升。具体请看下面例子足以说明函数提升的更凶一些。 今天,又由一到题目引发了一场我跟JS基础的较量:首先是 var getName = function(){alert(1)}; function getName(){alert(2)}; getName();// 1 or function g...
摘要:全局对象在程序任何地方都能访问到的对象,在浏览器中是变量指向在中是什么外部环境暂时不讲。函数声明直接提前。执行过程,函数执行和销毁过程。变量预解析,赋值外部环境之间的关系。如果做不对,继续找,直到合格。 当程序在浏览器中运行的时候,js引擎会产生三个东西。 showImg(https://segmentfault.com/img/bVMjv4?w=890&h=422);1.全局对象 ...
摘要:数据的存储前言数据类型汇总整型家族浮点型家族自定义类型指针类型。整型家族注在之后的标准规定,将类型数据划分为整型家族,因为字符在内存中会将其转化为码值进行存储。 ...
摘要:本计划一共期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划,点击查看前端进阶的破冰之旅本期推荐文章深入之执行上下文栈和深入之变量对象,由于微信不能访问外链,点击阅读原文就可以啦。 (关注福利,关注本公众号回复[资料]领取优质前端视频,包括Vue、React、Node源码和实战、面试指导) 本周正式开始前端进阶的第一期,本周的主题是调用堆栈,今天是第二天。 本计划一共28期,每期...
阅读 3011·2021-10-27 14:15
阅读 2999·2021-09-07 10:18
阅读 1320·2019-08-30 15:53
阅读 1570·2019-08-26 18:18
阅读 3373·2019-08-26 12:15
阅读 3460·2019-08-26 10:43
阅读 654·2019-08-23 16:43
阅读 2207·2019-08-23 15:27