Javascript笔记《一》之解析与执行
来源:互联网 发布:ios 监控软件 编辑:程序博客网 时间:2024/06/05 05:07
JavaScript是一门运行在浏览器端解释执行的脚本语言。 其与一般的解释型语言(如shell)不同的是js并不像shell等脚本语言那样解释一行,执行一行; 而是分为预处理与执行二个阶段。
为了方便理解,预处理和执行阶段我们分为全局与函数分别介绍:
全局预处理阶段:
js引擎会创建一个全局的词法环境对象LexicalEnv, 同时扫描整个Js文件把用var声明的变量及用声明的方式创建的函数初始化为LexcialEnv的一个成员。
LexicalEnv{ 变量名: undefined, 函数名: 指向函数的引用}
全局的LexicalEnv其实就是window对象。
在这里有几个概念需说明一下:
函数创建的方式主要有4中:
a、声明的方式:function f(){}
b、函数表达式:var f = function(){}或var f = function xx(){}
c、new Function()方式: var f = new Function(“参数列表”,”函数体”);
d、匿名函数
在javacript中不存在块作用域,js引擎扫描时,会忽略全局的if、for。
如以下JS代码:
<script type="text/javascript"> console.log(a); console.log(b); console.log(c); console.log(d); console.log(e); console.log(i); console.log(f); console.log(g); var a = 10; b = 5; function f() { var e = 20; console.log('f'); } var g = function() { console.log(g); } if(false){ var d = 20; }else{ c = 5; } for(var i = 0; i < 10; i++){}</script>
以上代码输出结果:
实际上以上代码是不能运行的,必须把console.log(b)及console.log(c)、console.log(e)这3行必须注释掉程序才能运行。这很好理解,因为变量b、c并未用var声明,而e是在函数f的内部定义的,根据前面的知识, 全局的词法环境对象中不会存在这3个变量,所以会报“is not defined”错误。
console.log(a)、console.log(d)、console.log(i)、console.log(g) 输出“undefined”;
console.log(f)输出:function f(){var e = 20; console.log(‘f’)}。
根据以上代码测试结果,可以分析得出预处理阶段的词法环境对象初始化过程:
LexicalEnv{ a:undefined, d:undefined, i:undefined, g:undefined, f:指向函数的引用}
全局执行阶段:
执行阶段会给变量赋值,及函数调用。
注意:如果变量未用var声明(包括函数内),执行时会把该变量加入到全局词法环境对象中,并初始化。
执行之后,全局词法环境对象为:
LexicalEnv{ a:10, b:5, c:5, d:undefined, f:执行函数的引用, g:执行函数的引用, i:10}
函数预处理阶段:
1、函数每调用一次,就会产生一个LexicalEnv对象
2、函数中的参数会加入到词法对象中,并初始化实际参数的值
3、函数内部声明式函数
4、函数内部var定义的变量
与全局预处理阶段不同的是,多了1、2步骤。
我们来看下如下代码:
function f(a, b){alert(a);alert(b); alert(c); alert(d);var c = 20;function d(){}}f(1,2);输出结果:
a的值为1, b的值为2, c的值为undefined, d的值为函数的引用。
在函数f被调用时,会创建一个词法对象LexicalEnv,而且是每调用一次,就会创建一个。
LexicalEnv{ a:1, b:2, c:undefined, d:指向函数的引用}
函数执行阶段:与全局执行阶段一样。
注意:如果变量未用var声明,执行时会把该变量加入到全局词法环境对象中,并初始化。
- Javascript笔记《一》之解析与执行
- JavaScript的解析与执行
- JavaScript之解释与执行
- 初识JavaScript的解析与执行过程
- JavaScript定时器与执行机制解析
- Javascript语法笔记一之typeof与instanceof的用法
- JavaScript之执行环境与作用域
- JavaScript面试之预编译与执行
- 【高性能 JavaScript --笔记】JavaScript 加载与执行
- 《高性能 JavaScript》笔记(一):脚本加载和执行
- MapReduce调度与执行原理之任务执行(一)
- Android入门笔记之源码解析一
- 高性能javascript(一)加载与执行
- javascript学习笔记之(一)
- 深入理解javascript(一)-- 之执行上下文(execution context)
- JavaScript初学笔记之<执行环境及作用域>
- [WebKit] JavaScriptCore解析--基础篇(四) 页面解析与JavaScript元素的执行
- Chrome内核解析 -- 背景篇:HTML, CSS解析与JavaScript执行
- LeetCode 119 Pascal's Triangle II
- 指令集
- Cin 深入剖析
- Android 源码 listview 重用机制 浅析
- 通过ssh通道加密通信数据
- Javascript笔记《一》之解析与执行
- 像bootstrap一样的去做web编程
- 对hadoop的一些命令总结
- MPEG(运动图像专家组)是 Motion Picture Experts Group 的缩写
- java.lang.UnsupportedOperationException: Can't convert to dimension: type=0x1
- unity for Vuforia5.5.9 遇到的问题
- Atitit.android播放smb 网络邻居视频文件解决方案
- Failed to add uid rule (Invalid argument)
- 百度2016校招笔试题(含答案)