`
897371388
  • 浏览: 528210 次
文章分类
社区版块
存档分类
最新评论

深入javascript引擎对脚本的处理过程

 
阅读更多

javascript程序与宿主环境进行交互,是通过一系列预定义的方法和属性实现的,这些方法和属性会再映射成浏览器的内部原生代码,所以与其他很对常规的编程语言不同,浏览器开放的这些借口往往受限且有针对性。

a)无论是独立的窗口还是在框架里面,每个展示在浏览器里面的html文档,都被赋予了一个独立的javascript执行环境实例,在这个环境里面加载的脚本的所有全局变量和函数都拥有一个独立的命名空间。

b)同一个文档的所有脚本都运行在同一个执行环境里面,共享同一个沙箱,并且能够通过浏览器提供的API与其他上下文环境交互。

c)在特定的执行上下文里面,每段javascript代码块都是自成体系处理的,顺序也基本确定。每段代码块都是由若干符合语法格式的独立单元组成,处理的过程包括清晰而且连续的三个步骤:源码处理,函数解析,代码执行。

1)源码处理

源码处理阶段会检查脚本代码块里面的语法,通常会先把代码转换成中间层的二进制映像,这样才能或得到令人满意的执行速度。在彻底完成这一步骤之前,这些二进制代码对全局并无影响。如果源码处理阶段出错,整个有问题的代码块都会被弃用;然后解析器会继续处理下一段代码块。 如下示例:

<script type="text/javascript">
	console.log(Benjamin);
	console.log("Benjamin module01");
</script>
<script type="text/javascript">
	console.log("Benjamin module02");
</script>


打印信息:

由上结果,代码块一报错,整个有问题的代码块被弃用,解析器继续处理下一段代码块。

2)函数解析

源码处理之后,解析器对当前代码块里所有具名的全局函数进行识别并注册。在这一阶段完成之后,这些函数才能被执行代码所调用。看下面示例2.1

<script type="text/javascript">
	getMessage();
	function getMessage(){
		console.log("Hello Benjamin!");
	}
</script>


输出Hello Benjamin!,更改成如下表达式声明的代码:

<script type="text/javascript">
	getMessage();
	var getMessage = function(){
		console.log("Hello Benjamin!");
	}
</script>

会报错,TypeError: getMessage is not a function,因为这样的声明的等价于下面的代码,声明提前了,看示例2.2

<script type="text/javascript">
	var getMessage = null;
	getMessage();
	getMessage = function(){
		console.log("Hello Benjamin!");
	}
</script>

如果放到两个代码块中会怎样呢?看示例2.3

<script type="text/javascript">
	getMessage();
</script>
<script type="text/javascript">
	var getMessage = function(){
		console.log("Hello Benjamin!");
	}
</script>

因为javascript处理代码块的属性是由javascript引擎读取代码块的先后顺序决定的。当调用的getMessage()函数的时候 getMessage方法还么哟定义呢。javascript这种全局名称解析模型只针对于函数有效,而对于变量的声明却并非如此。变量是按照执行的时候出现的顺序注册的。

3)代码执行

函数解析完后,javascript引擎就会开始顺序执行在函数区块之外的所有代码。如果在执行过程中,当前代码块产生某些异常,脚本的执行可能会失败。其他代码块中的代码扔能正常执行,具体参见源码处理中的示例。

分享到:
评论

相关推荐

    HTML5专业级图像处理引擎(AlloyImage) v1.1腾讯开源版.rar

    AlloyImage是一个使用Javascript语言开发的,基于Web的在线图像处理引擎,除了核心底层图像处理引擎,还同时集成了一些方便快捷的图像处理API,您可以将它简单快捷的引用到您的Web网页中,做出与photoshop一样的优美...

    JavaScript执行顺序详细介绍

    JavaScript引擎的工作机制比较深奥是因为它属于底层行为,那么JavaScript代码执行顺序就比较形象了,因为我们可以直观感觉到这种执行顺序,当然JavaScript代码的执行顺序是比较复杂的,所以在深入JavaScript语言之前...

    智动网页内容采集器 v1.92.zip

    12、可自设客户信息模拟百度等搜索引擎对目标网站采集  13、本软件永久终身免费使用 智动网页内容采集器 v1.9更新: 软件内置网址更新为www.zdexe.com 采用全新的智动软件控件UI 增加用户反馈到EMAIL功能 ...

    《Android应用开发揭秘》源码

     杨丰盛,Android应用开发先驱,对Android有深入研究,实战经验极其丰富。精通Java、C、C++等语言,专注于移动通信软件开发,在机顶盒软件开发和MTK平台软件开发方面有非常深厚的积累。2007年获得中国软件行业协会...

    Android应用开发揭秘

    杨丰盛,Android应用开发先驱,对Android有深入研究,实战经验极其丰富。精通Java、C、C++等语言,专注于移动通信软件开发,在机顶盒软件开发和MTK平台软件开发方面有非常深厚的积累。2007年获得中国软件行业协会...

    深入了解MicrosoftAJAXLibrary

    Web请求的详细情况脚本服务的代理对象部分呈现引擎AJAX是异步JavaScript和XML的缩写,暗示着AJAX和JavaScript之间有着必然的联系。尽管JavaScript是简单的编程语言,但它早在多年前就已经打下了坚实的基础,虽然当时...

    《Ajax与PHP基础教程》第二章.

    对于Ajax有一个误解:能够实现这么酷的功能,JavaScript代码肯定是很难实现和维护...注意,Ajax是一 种JavaScript工具,因此当尝试理解Ajax类型的应用程序时,对JavaScript基础知识的掌握就尤为 重要.让我们从基础知识开始.

    精通AngularJS part1

    他精通客户端和服务器端编程,并始终在寻找能提高生产率的工具和流程。Pawel是自由和开源软件的坚定支持者,他在AngularJS 社区非常活跃,为AngularJS项目贡献了大量的代码。他也对Angular UI (AngularJS的配套框架...

    深入理解 Event Loop事件循环机制

    javascript从诞生之日起就是一门单线程的非阻塞的脚本语言。这是由其最初的用途来决定的:与浏览器交互。 首先等来了解js为什么是单线程的吧! 首先要明白线程的概念? 进程是资源分配的最小单位,线程是进程的一...

    深入浅析JS中的严格模式

    直接添加下面的这句字符串就可以了,这种语法可以向后兼容,如果是不支持严格模式的javascript引擎,就会直接当成是一个未赋值的字符串字面量,会直接忽略,支持的引擎就会开启严格模式 'use strict' 说明: 1.在全局作用...

    10个技巧,让你在2017年成为更好的Node开发者

    而本文则会深入分析浏览器对于JavaScript的这些处理流程,挖掘出那些影响你应用启动时间的罪魁祸首,并且根据我个人的经验提出相对应的解决方案。回顾过去,我们还没有专门地考虑过如何去优化JavaScript解析/编译...

    asp.net基于工作流引擎的系统框架设计开发(源代码+论文)_new.rar

    - 源代码:提供Java与ASP整合的Web系统的完备代码,从前端界面代码(HTML、CSS、JavaScript)到后端的Java与ASP代码,再到数据库相关脚本。学生可以参考、修改或基于此代码进一步拓展。 - 辅助信息:包括其他与项目...

    ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现(源代码+论文)_new.rar

    - 源代码:提供Java与ASP整合的Web系统的完备代码,从前端界面代码(HTML、CSS、JavaScript)到后端的Java与ASP代码,再到数据库相关脚本。学生可以参考、修改或基于此代码进一步拓展。 - 辅助信息:包括其他与项目...

    白帽子讲浏览器安全.钱文祥(带详细书签).pdf

    3.5 处理脚本 59 3.5.1 脚本的编码 60 3.5.2 IE的CSS expression的各种编码模式 62 3.5.3 浏览器的应对策略:CSP 63 3.5.4 “绕过”CSP:MIME Sniff 65 3.5.5 简单的Fuzz:混淆CSS expression表达式 68 3.6 ...

    达内java培训目录

    深入理解JavaScript语言原理;熟练的使用JavaScript对HTML DOM进行编程;熟练掌握JavaScript对象对象封装技巧,为后续的JavaScript学习打下坚实的基础。 Servlet/JSP Servlet生命周期及Servlet服务器、Tomcat...

    精通qt4编程(源代码)

    \ 第8章 文件处理 蔡志明介绍了Qt的文件处理,包括基于流的文本文件和二进制文件处理,文件信息和目录操作,目录以及文件的变化监控,文件引擎的编写。 219 \ 第9章 网络 李立夏介绍了Qt的网络处理,包括编写常见的...

    精通Qt4编程(第二版)源代码

    \8.6 文件引擎 226 \8.7 小结 226 \第9章 网络 227 \9.1 FTP客户端 227 \9.2 HTTP客户端 235 \9.3 UDP应用 239 \9.4 TCP应用 243 \9.5 高级应用 253 \9.5.1 底层操作 253 \9.5.2 使用代理 256 \9.5.3 扩展...

Global site tag (gtag.js) - Google Analytics