深入理解javascript原型和闭包(8)——简述【执行上下文】上
来源:互联网 发布:数据安全 编辑:程序博客网 时间:2024/05/01 15:02
什么是“执行上下文”(也叫做“执行上下文环境”)?暂且不
下定义,先看一段代码:
第一句报错,a未定义,很正常。第二句、第三句输出都是undefined,说明浏览器在执行console.log(a)时,已经知道了a是undefined,但却不知道a是10(第三句中)。
在一段js代码拿过来真正一句一句运行之前,浏览器已经做了一些“准备工作”,其中就包括对变量的声明,而不是赋值。变量赋值是在赋值语句执行的时候进行的。可用下图模拟:
这是第一种情况。
下面还有。先来个简单的。
有js开发经验的朋友应该都知道,你无论在哪个位置获取this,都是有值的。至于this的取值情况,比较复杂,会专门拿出一篇文章来讲解。
与第一种情况不同的是:第一种情况只是对变量进行声明(并没有赋值),而此种情况直接给this赋值。这也是“准备工作”情况要做的事情之一。
下面还有。。。第三种情况。
在第三种情况中,需要注意代码注释中的两个名词——“函数表达式”和“函数声明”。虽然两者都很常用,但是这两者在“准备工作”时,却是两种待遇。
看以上代码。“函数声明”时我们看到了第二种情况的影子,而“函数表达式”时我们看到了第一种情况的影子。
没错。在“准备工作”中,对待函数表达式就像对待“ var a = 10 ”这样的变量一样,只是声明。而对待函数声明时,却把函数整个赋值了。
好了,“准备工作”介绍完毕。
我们总结一下,在“准备工作”中完成了哪些工作:
• 变量、函数表达式——变量声明,默认赋值为undefined;
• this——赋值;
• 函数声明——赋值;
这三种数据的准备情况我们称之为“执行上下文”或者“执行上下文环境”。
细心的朋友可能会发现,我们上面所有的例子都是在全局环境下执行的。其实,javascript在执行一个代码段之前,都会进行这些“准备工作”来生成执行上下文。这个“代码段”其实分三种情况——全局代码,函数体,eval代码。
这里解释一下为什么代码段分为这三种。
所谓“代码段”就是一段文本形式的代码。
首先,全局代码是一种,这个应该没有非议,本来就是手写文本到script标签里面的。
<script type="text/javascript"> //代码段 </script>
其次,eval代码接收的也是一段文本形式的代码。
eval("alert(123)");
最后,函数体是代码段是因为函数在创建时,本质上是 new Function(…) 得来的,其中需要传入一个文本形式的参数作为函数体。
注:
每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
全局执行环境的变量对象是window对象。
后台的每个执行环境都有一个表示变量的对象——变量对象。全局环境的变量对象始终存在,二局部环境的变量对象,则旨在函数执行的过程中存在。
- 深入理解javascript原型和闭包(8)——简述【执行上下文】上
- 深入理解javascript原型和闭包(8)——简述【执行上下文】上
- 深入理解javascript原型和闭包(8)——简述【执行上下文】上
- 深入理解javascript原型和闭包(8)——简述【执行上下文】上
- 深入理解javascript原型和闭包(8)——简述【执行上下文】上
- 深入理解javascript原型和闭包(8)——简述【执行上下文】上
- 深入理解javascript原型和闭包(8)——简述【执行上下文】上
- 深入理解javascript原型和闭包(8)——简述【执行上下文】上
- 深入理解javascript原型和闭包(8)——简述【执行上下文】上
- 深入理解javascript原型和闭包(8)——简述【执行上下文】上
- 深入理解javascript原型和闭包系列 深入理解javascript原型和闭包(8)——简述【执行上下文】上
- 深入理解javascript原型和闭包(8)——简述【执行上下文】
- 深入理解javascript原型和闭包(9)——简述【执行上下文】下
- 深入理解javascript原型和闭包(9)——简述【执行上下文】下
- 深入理解javascript原型和闭包(9)——简述【执行上下文】下
- 深入理解javascript原型和闭包(9)——简述【执行上下文】下
- 深入理解javascript原型和闭包(9)——简述【执行上下文】下
- 深入理解javascript原型和闭包(9)——简述【执行上下文】下
- WebView踩坑(一),load()加载数据出现乱码
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.8-4.1.9)
- python list用法
- POJ 3020 Antenna Placement 匈牙利算法
- Ajax基础与运用
- 深入理解javascript原型和闭包(8)——简述【执行上下文】上
- 关于网络协议封装的一些新想法
- vs2015 + EasyX loadimage()用法,和把图片添加为项目资源
- CSS清除浮动大全共8种方法
- [机器学习] 深度学习之caffe1——软件配置与测试
- 【响应式Web设计】读书笔记
- 享元模式(Flyweight)
- 判断元素是否进入二级菜单,使用setInterval()与setTimeout()时出现的问题
- 在相册查看保存的图片