声明的提升

作者: Mr_Bird | 来源:发表于2017-09-12 12:04 被阅读0次

首先先下个结论,javascript代码在执行时表面并不是由上到下一行一行执行的。

什么是声明的提升?

1.众所周知var a;如果a不赋值的话,a的值为undefined。

var a;
console.log(a); // undefined
  1. 未声明直接赋值的变量
a = 1;
console.log(a); // 1

上面的代码块为什么打印的是1,而不是undefined呢?很明显a是声明了的,但是a声明在全局作用域了还是局部作用域了呢?

  1. 在局部作用域给未声明的变量赋值
(function() {
  a = 1;
})()
console,log(a); // 1

这时可以得到结论:变量a被声明为了全局变量

下面回到正题:

a = 1;
var a;
console.log(a); // 1

这时候a的值为1,是为什么呢?还是因为a被声明为全局变量了么?先来看下一个例子:

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

很奇怪,第二个console的结果a是未被定义的。现在回想或者到文章开头看看一开始的结论,是不是明白了点什么。那代码执行真正的顺序是什么样的呢?往下看

console.log(a); // undefined
var a = 1;

a的值是undefined,说明a在console之前就已经声明了,但是并没有赋值。上面代码块可以理解为一下代码:

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

现在可以有第二个结论了:

引擎会在解释 JavaScript 代码之前首先对其进行编译。编译阶段中的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来。所以正确的思路应该是: 所有变量的声明都会在任何代码被执行前首先被处理(函数也一样)。

当我们看到var a = 1;时,javascript其实是将它看成两个语句:var a; 和 a = 1; 声明是在编译阶段进行的,而赋值操作等待在原地等待被执行。这就叫提升。

注意:提升只会提升到当前作用域!

相关文章

  • 声明的提升

    首先先下个结论,javascript代码在执行时表面并不是由上到下一行一行执行的。 什么是声明的提升? 1.众所周...

  • 声明提升

    js代码解析原则:首先js引擎在读取js代码时会进行两个步骤,第一个步骤是解释,第二个步骤是执行。所谓解释就是会先...

  • 声明提升

    只有声明本身会被提升,而赋值或其他的运算逻辑罗留在原地.如果提升改变了代码执行的顺序,会造成非常严重的破坏.

  • 声明提升

    函数优先 函数声明和变量声明都会被提升,值得注意的是函数声明首先会被提升,然后才是变量 结果是2,不是1

  • 函数声明提升与变量声明提升

    最近在吃饭的时候看到一道关于函数声明提升的问题 很多人在看第一眼的时候会认为结果为10,我作为一个小白第一反应也是...

  • 引用类型

    变量提升和函数声明提升   函数声明提升就是把函数声明提升到函数声明所在作用域中(或者说一个函数体内)的顶端,变量...

  • js变量的声明提升和函数的声明提升

    Js代码分为两个阶段:编译阶段和执行阶段Js代码的编译阶段会找到所有的声明,并用合适的作用域将它们关联起来。包括变...

  • JS变量声明提升和函数声明提升

    JS代码分为两个阶段:编译阶段和执行阶段; 编译阶段:会找到所有的声明,并用合适的作用域将它们关联起来,这是词法作...

  • 详解变量声明提升和函数声明提升

    1. 变量声明提升 1.1 变量定义 可以使用var定义变量,变量如果没有赋值,那变量的初始值为undefined...

  • 变量声明 var、let、const

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

网友评论

    本文标题:声明的提升

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