js预解析

首先来一个简单的代码:

<script>
    console.log(a);
    var a = 10;
    console.log(a);
    function a() {
        var b = 1;
    }
    console.log(a);
    var a = function() {
        var b = 2;
    };
    console.log(a);
</script>

那么结果是什么呢?
我本来以为是undefined、10、function a() { var b = 1; }、function() { var b = 2; }
但是结果却是这样的:



为什么会这样呢,是因为 js 在正常解析前先进行预解析,那么如何预解析呢?

  • var 预解析
    js 在正常解析之前,会快速的把 script (或者 funciton )中的 var 声明及声明的名字,提升到代码块(作用域)的最前面。
  • function 预解析
    js 在正常解析之前,会快速的把 script (或者 funciton )中的 function 及内容提升到代码块(作用域)的最前面,跟在 var 声明之后。

在预解析时,会产生一个仓库,存储声明的变量和函数,如果变量或函数有同名的情况,则覆盖前面的,只留一个。在解析代码时,在这个仓库里找同名的变量或是函数

下面是我对上面例子的预解析过程的理解:
第一步对 var、function 提升:

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

第二步同名覆盖:

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

预解析后, js 会从上到下一行一行执行,遇到表达式时,如果表达式对变量进行修改,则修改预解析的值。就像上面的yu

总结:感觉自己要巩固基础

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • js预解析总结 个人学习总结,不当之处欢迎扶正 理解声明和定义 声明(declare):告诉浏览器在当前作用域中存...
    时修七年阅读 586评论 0 0
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,195评论 0 13
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,827评论 2 17
  • 好多年前,我根本不知道他叫什么,家里的大人,都让我称他为“小哥”。在年幼的孩子眼里,他也不算“小”,甚至靠近“大”...
    王墨白的万物之屋阅读 472评论 0 2
  • 在高三七班一年或两年,之于生命的岁月长河,虽然不似一滴水之于大海,也是很短很短,但却是我们人生路上的一个十分重要的...
    山高人为峰1阅读 665评论 0 1