博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript小记-javascript运行机制
阅读量:6767 次
发布时间:2019-06-26

本文共 836 字,大约阅读时间需要 2 分钟。

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

对于传统编译型语言来说,编译步骤分为:词法分析、语法分析、语义检查、代码优化和字节生成。

但对于解释型语言来说,通过词法分析和语法分析得到语法树后,就可以开始解释执行了。
(任何语言都有编译过程,只是解释型语言没有编译成二进制代码)

 

一、javascript的运行机制:

step1.

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

step2.(编译

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

step3.(编译

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

step4.(执行

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

step5.

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

 

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

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

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

      确定执行上下文

 

 二、

来看一个例子

1 

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

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

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

 

再来看一个例子

1 

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

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

i=window.i

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

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

 

转载于:https://www.cnblogs.com/fanfan259/p/3521013.html

你可能感兴趣的文章
grep
查看>>
H3C开启tracert路径回显ip ttl和ip unreahables命令都要配置的原因
查看>>
Mysql完全备份和恢复
查看>>
Skia深入分析7——区域解码
查看>>
单链表的折半查找,冒泡排序,选择排序
查看>>
WebM (VP8) vs H.264
查看>>
字符串相关函数的模拟实现
查看>>
MySQL的编译安装和基本配置
查看>>
博客网站模板
查看>>
LVS集群详解(持续更新中)
查看>>
shell-for循环语句
查看>>
搬砖-运维管理平台OpsMange安装部署
查看>>
WPF的消息机制(三)- WPF内部的5个窗口之处理激活和关闭的消息窗口以及系统资源通知窗口...
查看>>
Spread for Windows Forms快速入门(14)---文件操作
查看>>
html
查看>>
JDBC编程专题3之JDBC环境设置和JDBC简单示例代码
查看>>
canvas实现简单的Amaziograph效果画对称图
查看>>
QT5.2 编译与较早版本的区别
查看>>
Java 搞定 SQL 集合运算的最简方法
查看>>
函数参数的扩展(六)
查看>>