zoukankan      html  css  js  c++  java
  • javascript小记-javascript运行机制

    任何语言的运行过程中,都会有编译执行

    对于传统编译型语言来说,编译步骤分为:词法分析、语法分析、语义检查、代码优化和字节生成。
    但对于解释型语言来说,通过词法分析和语法分析得到语法树后,就可以开始解释执行了。
    (任何语言都有编译过程,只是解释型语言没有编译成二进制代码)

    一、javascript的运行机制:

    step1.
    读入第一个代码段(<script></script>)

    step2.(编译
    语法分析,有错则报语法错误(比如括号不匹配),跳转到step5

    step3.(编译
    对var变量和function定义做'预解析'(变量声明,函数声明,不会报错,因为只解析正确的声明)

    step4.(执行
    执行代码段,有错则报错(比如变量未定义)

    step5.
    读入下一个代码段,重复执行step2

    在编译的时候,确定作用域,生成语法树

          除了做必要的语法检查之外,会将 函数的声明和变量作用域的声明放入到语法树

    在执行的时候,取得作用域

          确定执行上下文

     二、

    来看一个例子

    1 <script type="text/javascript">
    2     alert(i);
    3     var i='fanfan';
    4 </script>

    上例会输出 undefined,这就会涉及到js中作用域的问题;

    在js编译的过程中,要确定作用域,此例中,在编译的时候已经找到了变量 i 的声明,

    只是在执行的时候,由于变量i未被初始化,所以输出undefined;

    再来看一个例子

    1 <script type="text/javascript">
    2     alert(i);
    3     i='fanfan';
    4 </script>

    上例会报错,根据js的运行步骤,在编译过程中确实作用域的时候,

    变量 i ,由于没有var,符合全局变量,所以 i 就相当于在全局对象window上添加了一个属性

    i=window.i

    但是在程序执行的过程中,确定作用域的时候,由于当前作用域未找到变量 i 的定义,会一直找到全局作用域

    但在alert的时候,此时变量 i ,还没有添加到全局对象window上,所以会报错,ReferenceError: i is not defined

  • 相关阅读:
    java 万能转换器 输入SQL 直接得到ArrayList
    社交原理
    意志力和自律
    windows phone 8.1 让项目开启蓝牙genericAttributeProfile
    C# JSON和对象之间互相转换
    QTC++监控USB插拔
    英语通假字
    #ifdef 支持Mac #ifndef 支持Windows #if defined (Q_OS_WIN) 应该可以再两个系统通用
    Qt5.3.2 在MAC yosemite下编译出错 Could not resolve SDK path
    Mac 用Ctr+C复制,Ctr+V 粘贴
  • 原文地址:https://www.cnblogs.com/fanfan259/p/3521013.html
Copyright © 2011-2022 走看看