var 变量提升分析

作者: 青山旁小溪边 | 来源:发表于2019-11-07 10:12 被阅读0次

原理

JS的工作方式

  1. 先解析代码,获取到所有被声明的变量。
  2. 然后再运行。

换成专业术语就是预处理阶段和执行阶段。
什么是变量提升,它的定义是什么?
变量提升:所有变量的声明语句都会被提升到代码头部。
例子:

console.log(a);
var a = 100;

在控制台执行以上代码并不会报错误,它会打印undefined,其实在js中运行过程是:

var a;
console.log(a);
a = 100;

运行过程中变量a已经声明,但未被赋值。
变量提升只适用于用var声明的变量

console.log(a);
a = 100;

这种情况,js就会抛出异常:Uncaught ReferenceError: a is not defined

function函数也是变量,所以它也存在变量提升
例子:

a();
function a(){
  console.log(1)
}

由于变量提升的原因,打印结果:1
但是如果是赋值语句定义函数,js就会报错:

a();
var a = function a(){
  console.log(1)
}

js抛出异常:Uncaught ReferenceError: a is not defined
why?
js运行过程中,它把声明的a变量提升了,运行代码其实是这样的:

var a;
a();
a = function(){
    console.log(1);
};

最后的总结

  • 所有的声明都会提升到作用域的最顶上去。
  • 同一个变量只会声明一次,其他的会被忽略掉或者覆盖掉。
  • 函数声明的优先级高于变量申明的优先级,并且函数声明和函数定义的部分一起被提升。

相关文章

  • var 变量提升分析

    原理 JS的工作方式 先解析代码,获取到所有被声明的变量。 然后再运行。 换成专业术语就是预处理阶段和执行阶段。什...

  • js 预编译

    js运行 一、语法分析 二、预编译函数声明整体提升变量声明提升;var a = 123; 这个叫变量声明加赋值;如...

  • ECMAScript 6 一问三不知

    let var const let 块级作用域不存在变量提升(var变量提升,值为undefined,let变量必...

  • js 全局变量与私有变量

    /* * 变量提升: * var a; var b; var c; * fn = XXX */ var a = 1...

  • ES6之 let,const

    var 声明与变量提升 var是js的变量声明语句,使用var声明的变量,无论其声明的实际语句在何处,都会被提升到...

  • 变量声明 var、let、const

    1. var变量声明提升 var声明的变量,发生变量声明提升;即:变量的声明被提升到该作用域的顶部 let 和 c...

  • ES6基础1-2(手写深拷贝、Vue数据劫持、Object.de

    1.var都要改为let和const var声明的变量 (污染全局变量) 使用var导致变量提升的问题 var可以...

  • 2019-07-25

    1.let var区别 var,let 作用域在该代码块中。let 不存在变量提升,var 存在变量提升。cons...

  • JavaScript基础学习(八)-变量的声明

    var let const声明变量 var 变量foo用var声明,会发生变量提升,即脚本开始运行时,变量foo已...

  • [深入理解ES6]块级绑定

    var声明与变量提升 变量提升(hoisting):使用var关键字声明的变量,无论声明位置在何处,都会被视为声明...

网友评论

    本文标题:var 变量提升分析

    本文链接:https://www.haomeiwen.com/subject/jnembctx.html