zoukankan      html  css  js  c++  java
  • JavaScript预解析

    1 预解析

    1.1 预解析的基本步骤

    在JS引擎执行JS代码会分成三个步骤进行解析代码:

    第一步:JS引擎先将JS代码整体按照JS语言的规则进行分词,也就是JS代码的词法分析.

    第二步:然后JS引擎浏览JS代码,并对代码进行语法分析,这里只关注代码中变量的声明和函数的声明,这第二步也就叫预解析.

    第三步:从上往下,从左到右的执行代码.

    第一和第二步都是在执行代码前JS引擎内部执行的过程,尤其是第二步预解析的过程对JS代码的执行顺序有着极其重要的影响.

    而对于变量的声明和函数的声明,这两种声明在执行预解析的时候效果也是不同的.

    1.2 变量声明的预解析过程

    变量的声明是通过关键字var来实现的

    .当JS引擎遇到var时会首先在当前作用域中查找是否有声明过这个变量名,如果没有就在当前作用域中添加这个变量,如果有那该次声明就被视为无效.

    1.3 函数声明的预解析

    函数的声明分为两种:

    通过function函数声明的方式声明函数,在预解析的时候,首先在当前作用域中查找是否有声明过这个函数名的变量,如果没有在当前作用域中添加该函数名的变量,如果有则不再重复声明,然后给这个变量进行赋值,赋的值就是这个函数.

    但是通过函数字面量方式声明的函数就相当于变量的声明,所以函数字面量声明的情况和变量声明的预解析过程一样.不考虑赋值语句后面的执行.

    1.4 预解析的影响

    在执行代码前会,预解析过程会在各自作用域中将执行所有声明语句,这样我们就会觉得预解析将声明语句进行了提升.

    需要注意的是,声明的变量还是属于各自的作用域,预解析的过程不存在改变变量的作用域.

    1.5 词法作用域

    词法作用域指的是从代码的可读区域到不可读区域,形成的密闭的独立的内存空间.

    在每个词法作用域都会执行一遍新的词法分析,语法分析,执行代码三个JS引擎步骤,并且不影响其他词法作用域.

    在JS中函数是一个密闭的独立的内存空间,所以函数就是一个词法作用域.

  • 相关阅读:
    有点忙啊
    什么是协程
    HDU 1110 Equipment Box (判断一个大矩形里面能不能放小矩形)
    HDU 1155 Bungee Jumping(物理题,动能公式,弹性势能公式,重力势能公式)
    HDU 1210 Eddy's 洗牌问题(找规律,数学)
    HDU1214 圆桌会议(找规律,数学)
    HDU1215 七夕节(模拟 数学)
    HDU 1216 Assistance Required(暴力打表)
    HDU 1220 Cube(数学,找规律)
    HDU 1221 Rectangle and Circle(判断圆和矩形是不是相交)
  • 原文地址:https://www.cnblogs.com/chendu/p/5918357.html
Copyright © 2011-2022 走看看