美文网首页
JS预处理与声明提前

JS预处理与声明提前

作者: Nebulium | 来源:发表于2018-08-26 12:07 被阅读0次

针对ES5。预处理阶段涉及到(var关键字声明的,包括函数表达式)变量和(以function关键字声明的)函数的声明提前,并且还涉及到声明变量冲突的时候的解决方式。

声明提前

将变量保存到window域中,会扫描用var操作符声明的变量、以及用function关键字声明的函数指针,因此会产生变量和函数声明提前的效果。

观察下面的代码。

var a = 1;
      b = 2;
function f(){ console.log('11');}
var g = function(){ console.log('22'); };

在预处理阶段,window域的情况如下

window{
    f: 指向函数的指针,
    a: undefined,
    g: undefined
} //演示,非准确情况

在执行到对应语句的时候,情况如下

window {
    f: 指向函数的指针,
    a: 1,
    b: 2,
    g: 指向函数的指针
}

需要说明的是:

  1. 如果变量并没有用var声明,如b = 1;那么虽然在执行阶段将其默认为全局变量,在预处理阶段也不会将其添加到window域中。实际上,直到执行到这一条语句的时候,才会将其添加。
  2. 函数表达式用var声明,处理方式与用var声明的其他变量一样。
    如果变量并没有用var声明,如b = 1;那么即使在函数执行阶段将其默认为全局变量,在预处理阶段也不会将其添加到window域中。直到执行到这一条语句的时候,才会将其和对应的值添加。
    函数表达式用var声明,所以处理方式与用var声明的其他变量一样。
声明冲突

如果声明发生冲突,那么在预处理的时候遵循两个规则:

  1. 先扫描函数,再扫描var声明的变量
  2. 如果与之前的声明发生冲突的是函数,则覆盖
  3. 如果与之前的声明发生冲突的是用var声明的变量,则忽略。

举例如下

alert(f);
function f(){ console.log('11');}
var f = 1;

显然alert为"function f(){console.log('11');}"

相关文章

  • JS预处理与声明提前

    针对ES5。预处理阶段涉及到(var关键字声明的,包括函数表达式)变量和(以function关键字声明的)函数的声...

  • JS声明提前

    直接上一段代码解释下声明提前 alert(a) // 弹出函数a a(); // 弹出10...

  • JavaScript 声明提前机制

    声明提前机制 在JavaScript存在着这样一种预处理机制,即浏览器在解析JS代码时会将var声明的变量和fun...

  • JS作用域

    JS模块化 JS中变量声明问题 JS为弱类型,编译型语言声明提前在JS中,声明语句会被提前到文件首 静态类型为强类...

  • JS之执行顺序

    JS的解析过程分为两个阶段:预编译期(预处理)与执行期 预编译期 JS会对本代码块中的所有var声明的变量和函数进...

  • JavaScript面向对象编程

    JS的解析与执行过程 全局预处理阶段执行阶段 函数预处理阶段执行阶段

  • Day06 JavaScript

    1. JS 输出方式 2.JS变量声明 3.JS声明提前 4.JS基本数据类型 5.JS数组 6.JS对象 7.J...

  • 2016-11-23

    NAN表示一种非数据。 声明提前:JS在运行的时候会把所有变量提前到顶部,只是把声明提前,不会把赋值提前。 开关:...

  • 2016.11.23.JS

    NaN:表示非数字 声明提前:js在运行的时候,会把所有的变量提前到顶部,但只会把声明提前,不会把赋值提前 函数才...

  • Javascript重温OOP之JS的解析与执行过程

    了解js面向对象编程之前,首先要了解js的执行顺序。js的解析过程分为两个阶段:预处理阶段与执行期。 预处理阶段 ...

网友评论

      本文标题:JS预处理与声明提前

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