资讯专栏INFORMATION COLUMN

ES5和ES6中的变量声明提升

APICloud / 2009人阅读

摘要:结论对于中所说的变量声明提前,更准确的说法是变量定义声明提前了,更准确的理解是定义声明处于程序运行的第一个阶段导致相较于赋值声明的第二阶段有了前提的效果。

ES5和ES6中的变量声明提升

Example1:

a=2;
var a;
console.log( a );   //结果为2

Example2:

console.log( a );   //结果是undefined
var a=2;

Example2:

foo();  //结果是1
var foo;
foo = function() { 
    console.log( 2 );
};
function foo() { 
    console.log( 1 );
}

原理解读:浏览器引擎在运行程序分为两个阶段:第一个的阶段是编译阶段,该阶段负责找出代码中所有的定义声明(包括变量和函数),并关联到合适的作用域中;第二阶段是执行阶段,该阶段负责找出代码中的所有赋值声明,并在作用域找找到第一阶段的定义声明,以供使用。
代码解读
第一个例子在编译阶段会将var a;这句定义声明首先解读关联到全局作用域中,所以当在赋值声明阶段执行a=2;console.log(a);这两个赋值声明的代码时是正常执行的,也就有了定义声明提前了的感觉。

第二个例子也同样是第一阶段先解读了var a,这部分定义声明,接着在第二阶段的时候执行console.log(a);的时候报undefined,说明虽然定义声明虽然提前了,可是赋值声明a=2;这部分仍然未提前。

第三个例子在编译阶段会将 var foo;变量定义声明和 function foo(){...}函数定义声明提前,然后在第二阶段执行foo();赋值声明,这里需要注意的是在这种变量和函数重复声明的情况,函数定义申明会被提更前,原因倒不是真的是提前了,而只是在赋值声明的时候首先会去方法域中寻找,而后才去变量域中寻找,所以导致看起来是函数申明比变量声明更提前了。

结论:对于JS中所说的变量声明提前,更准确的说法是变量定义声明提前了,更准确的理解是定义声明处于程序运行的第一个阶段导致相较于赋值声明的第二阶段有了前提的效果。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83988.html

相关文章

  • ES5ES6作用域详解

    摘要:允许在块级作用域内声明函数。上面代码中,存在全局变量,但是块级作用域内又声明了一个局部变量,导致后者绑定这个块级作用域,所以在声明变量前,对赋值会报错。 ES5的作用域 变量起作用的范围,js中能创建作用域的只能是函数 { let a = 1; var b = 2; } console.log(a); // a is not defined console.log(b); //...

    Dr_Noooo 评论0 收藏0
  • JavaScript声明变量详解

    摘要:命令用于规定模块的对外接口,命令用于输入其他模块提供的功能所以在一定程度上来说,也具有声明变量的功能。当没有声明,直接给变量赋值时,会隐式地给变量声明,此时这个变量作为全局变量存在。 前言 如果文章中有出现纰漏、错误之处,还请看到的小伙伴多多指教,先行谢过 在ES5阶段,JavaScript 使用 var 和 function 来声明变量, ES6 中又添加了let、const、imp...

    paulquei 评论0 收藏0
  • ES6学习 第一章 let const 命令

    摘要:外层作用域不报错正常输出块级作用域与函数声明规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。规定,块级作用域之中,函数声明语句的行为类似于,在块级作用域之外不可引用。同时,函数声明还会提升到所在的块级作用域的头部。 前言:最近开始看阮一峰老师的《ECMAScript 6 入门》(以下简称原...

    番茄西红柿 评论0 收藏2637
  • ES6系列文章 块级作用域

    摘要:声明之函数作用域和全局作用域。块级作用域不能重复声明临时性死区等特性用来解决变量存在的种种问题。块级作用域终于在外面访问不到了。一些常量声明使用声明的变量名全部大写。 ES5之前javascript语言只有函数作用域和全局作用域,使用var来声明变量,var声明的变量还存在变量提升使人困惑不已。我们先来复习一下ES5的var声明,再对比学习let和const 。 var var声明之函...

    赵连江 评论0 收藏0
  • ES6学习之 -- letconst命令

    摘要:命令用来声明变量,它的用法类似,但是命令声明的变量只在所在的代码块中有效。不允许重复声明不允许在同一作用域声明两个相同的变量。对于内部的数据结构的变化是无法控制的。 let命令 用来声明变量,它的用法类似var,但是let命令声明的变量只在所在的代码块中有效。 { var a = 1; let b = 2; } console.log(a); // 1 con...

    marser 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<