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中所说的变量声明提前,更准确的说法是变量定义声明提前了,更准确的理解是定义声明处于程序运行的第一个阶段导致相较于赋值声明的第二阶段有了前提的效果。

ES5和ES6中的变量声明提升相关推荐

  1. 函数声明和变量声明提升

    var a; // 声明一个变量,标识符为a function a() { // 声明一个函数,标示符也为a } alert(typeof a); 显示的是"function",即 ...

  2. php变量 声明提升,TypeScript:let和const变量声明

    在开始介绍let和const变量声明前,有必要先了解下JavaScript里的var变量声明. var变量声明 全局声明 var声明在函数体外,所声明的变量为全局变量.var name = " ...

  3. JavaScript-----静态成员在ES5和ES6中的实现

    在学习静态成员在ES5和ES6中的实现之前我们先来了解一下静态成员的定义.  静态成员 :类的所有对象共享的成员(类的成员变量(属性)和成员方法) 看完这个定义我相信大家还是不太了解静态成员是什么意思 ...

  4. ES5和ES6中的this指向

    ES5和ES6中的this指向 ES5: 1.在普通函数中,this指向的是函数调用者,默认情况下,this指向的是window 2.在严格模式下,如果没有直接调用者,在函数中,this的值为unde ...

  5. ES6——let-const的变量声明以及模板字符串

    目录 一.let和const 1.let a.阻止变量提升 b.块级作用域 c.不能重复声明 2.const 二.模板字符串 ES5语言有很多地方存在不合理以及不足,比如变量的提升.内置对象的方法不灵 ...

  6. es6中的变量 解构 对象 数组 函数

    文章目录 一.变量/常量声明 二.解构 2.1.数组解构 2.2对象解构 3.3.字符串解构 4.数值解构 5.布尔值解构 三.对象 3.1.对象简写 3.2API拓展 四.扩展运算符 五.数组 5. ...

  7. Day3--js--可恶之变量声明提升大法.。。

    1.首先大家看一下下面的代码,判断下会输出什么结果: var foo = 1; function bar() {if(!foo) {var foo = 10;}alert(foo); } bar(); ...

  8. Js 变量声明提升和函数声明提升

    Js代码分为两个阶段:编译阶段和执行阶段 Js代码的编译阶段会找到所有的声明,并用合适的作用域将它们关联起来,这是词法作用域的核心内容 包括变量声明(var a)和函数声明(function a(){ ...

  9. ES5和ES6中对于继承的实现方法

    在ES5继承的实现非常有趣的,由于没有传统面向对象类的概念,Javascript利用原型链的特性来实现继承,这其中有很多的属性指向和需要注意的地方. 原型链的特点和实现已经在之前的一篇整理说过了,就是 ...

最新文章

  1. 4月29日监理师课程作业
  2. /dev/urandom
  3. 【约束布局】ConstraintLayout 组件可见性 View.GONE 处理 与 Margin 属性 ( 约束布局可见性处理 | goneMargin 属性 )
  4. ECMASCript 2019可能会有哪些特性?
  5. 涨知识!提单及运输业务中常用的一些代码、术语及意义!
  6. mysql中的函数编程_MySQL
  7. WP7 初始屏幕设置
  8. conda 升级_jupyter notebook升级体验!笔记本神器—Jupyter Lab
  9. linux内核并发教程,修改Linux内核参数提高Nginx服务器并发性能
  10. Particleground 粒子特效插件
  11. 女孩子没有事业就只能痛苦
  12. MinIO-linux-amd64下载
  13. 基于R语言混合效应模型(mixed model)案例研究
  14. Vue_01_组件的使用
  15. 2023电子科技大学计算机考研信息汇总
  16. 努力学习 努力奋斗 踏步而立
  17. dorado Tip控件:信息提示组件
  18. MATLAB中的数据精度处理
  19. 配置网络拓扑图测试软件,某网络拓扑图如下所示,三台路由器上均运行RIPv1协议,路由协议配置完成后,测试 - 信管网...
  20. 2021年教师资格证面试试讲稿:小学英语 Welcome to Africa

热门文章

  1. Python twisted框架使用解析
  2. 阿里云oss上传图片
  3. JAVA-JSP内置对象之application对象获得其他信息
  4. php内核探索 [转]
  5. 【移动开发】SparseArray替代HashMap
  6. 使用Microsoft EnterpriseLibrary(微软企业库)日志组件把系统日志写入数据库和xml文件...
  7. 了解VS2005为你的MFC程序做的一些事
  8. Windows 11 高门槛吓退用户,Linux 成香饽饽?
  9. 给2020划重点:最火的10个关键词和28个书单
  10. STM32之DAC原理