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

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

如果一个文档流中包含多个script代码段(用script标签分隔的js代码或引入的js文件),运行顺序是: 

step1. 读入第一个代码段,JavaScript执行引擎并非一行一行地执行程序,而是一段一段地分析执行的(以<\script\>标签来分割) 

step2. 做语法分析,有错则报语法错误(比如括号不匹配等),并跳转到step5 
step3. 对var变量做声明(初始为undefined)和function定义做“预解析”(永远不会报错的,因为只解析正确的声明) 
step4. 执行代码段,有错则报错(比如变量未定义) 
step5. 如果还有下一个代码段,则读入下一个代码段,重复step2 
step6. 结束 

 

JS的编译过程:

众所周知,javascript是解释型语言,它不同于c#和java等编译型语言。对于传统编译型语言来说,编译步骤分为:词法分析、语法分析、语义检查、代码优化和字节生成;但对于解释型语言来说,通过词法分析和语法分析得到语法树后,就可以开始解释执行了。

例子:

  1. alert(testNum);  
  2. alert('ok');  
  3. testNum = 2;  
  4. //testNum未声明,执行报错。  
  1. alert(testNum);  
  2. alert('ok');  
  3. var testNum = 2;  
  4. //弹出undefined和ok。预编译的时候,声明了变量t;执行到alert(t)这行代码的时候,t尚未被赋值,所以弹出undefined。  
  1. testFunc();  
  2. function testFunc() {}  
  3. alert('ok');  
  4. //弹出ok。预编译的时候,解析了定义式函数语句function testFunc() {},顺利执行。  
  1. testFunc();  
  2. var testFunc = function() {};  
  3. alert('ok');  
  4. //testFunc不是函数,执行报错。预编译的时候,声明了变量testFunc = undefined;执行到testFunc()时,testFunc还等于undefined,不是函数,所以执行testFunc()会报错。  
  1. <\script type="text/javascript">  
  2.     testFunc();  
  3.     alert('first block');  
  4. <!--\script-->  
  5. <\script type="text/javascript">  
  6.     alert('second block');  
  7. <!--\script-->  
  8. //弹出second block。因为JS是一段一段执行的,第一段执行到testFunc()的时候报错,整个第一段都不会再执行,第二段正常执行。 

 

转载于:https://www.cnblogs.com/clara/archive/2012/06/02/2532388.html

你可能感兴趣的文章
Python模块调用
查看>>
委托的调用
查看>>
c#中从string数组转换到int数组
查看>>
Scrapy入门程序点评
查看>>
DotNetty网络通信框架学习之源码分析
查看>>
8.1 Android Basic 数据存储 Preferences Structured(分组的Preferences)
查看>>
原因和证明
查看>>
VC6.0图像处理2--图像的反色
查看>>
Snoop, 对WPF程序有效的SPY++机制
查看>>
JAVA程序猿怎么才干高速查找到学习资料?
查看>>
使用axel下载百度云文件
查看>>
Qt中图像的显示与基本操作
查看>>
详解软件工程之软件测试
查看>>
WCF(二) 使用配置文件实现WCF应用程序
查看>>
【CodeForces 803 C】Maximal GCD(GCD+思维)
查看>>
python 去掉换行符或者改为其他方式结尾的方法(end='')
查看>>
数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
查看>>
REST构架风格介绍:状态表述转移
查看>>
struct {0}初始化
查看>>
c++ operator
查看>>