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中函数是一个密闭的独立的内存空间,所以函数就是一个词法作用域.

  • 相关阅读:
    HDU1294 Rooted Trees Problem(整数划分 组合数学 DP)
    HDU2546 饭卡(背包)
    经典动态规划总结
    POJ1285 Combinations, Once Again(背包 排列组合)
    计数 组合数学总结
    莫队算法 2038: [2009国家集训队]小Z的袜子(hose)
    循环-24. 求给定序列前N项和之二
    循环-23. 找完数
    循环-22. 输出闰年
    循环-21. 求交错序列前N项和
  • 原文地址:https://www.cnblogs.com/chendu/p/5918357.html
Copyright © 2011-2022 走看看