什么是“执行上下文”(也叫做“执行上下文环境”)?暂且不下定义,先看一段代码:

第一句报错,a未定义,很正常。第二句、第三句输出都是undefined,说明浏览器在执行console.log(a)时,已经知道了a是undefined,但却不知道a是10(第三句中)。

在一段js代码拿过来真正一句一句运行之前,浏览器已经做了一些“准备工作”,其中就包括对变量的声明,而不是赋值。变量赋值是在赋值语句执行的时候进行的。可用下图模拟:

这是第一种情况。

下面还有。先来个简单的。

有js开发经验的朋友应该都知道,你无论在哪个位置获取this,都是有值的。至于this的取值情况,比较复杂,会专门拿出一篇文章来讲解。
与第一种情况不同的是:第一种情况只是对变量进行声明(并没有赋值),而此种情况直接给this赋值。这也是“准备工作”情况要做的事情之一。

下面还有。。。第三种情况。
在第三种情况中,需要注意代码注释中的两个名词——“函数表达式”和“函数声明”。虽然两者都很常用,但是这两者在“准备工作”时,却是两种待遇。

看以上代码。“函数声明”时我们看到了第二种情况的影子,而“函数表达式”时我们看到了第一种情况的影子。
没错。在“准备工作”中,对待函数表达式就像对待“ var a = 10 ”这样的变量一样,只是声明。而对待函数声明时,却把函数整个赋值了。

好了,“准备工作”介绍完毕。
我们总结一下,在“准备工作”中完成了哪些工作:

  • 变量、函数表达式——变量声明,默认赋值为undefined;
  • this——赋值;
  • 函数声明——赋值;

这三种数据的准备情况我们称之为“执行上下文”或者“执行上下文环境”。

这里插一句题外话:通过以上三种情况,你可能会联想到网上的有些考js语法的题目/面试题。的确,几乎每个js语法题中都有这种题目出现。之前你遇到这种题目是不是靠背诵来解决?背过了,隔几天又忘记了。——任何问题,都要去追根溯源,要知道这个问题是真正出自哪一块知识点,要真正去理解。光靠背诵是没用的。 

细心的朋友可能会发现,我们上面所有的例子都是在全局环境下执行的。
其实,javascript在执行一个代码段之前,都会进行这些“准备工作”来生成执行上下文。这个“代码段”其实分三种情况——全局代码,函数体,eval代码。
这里解释一下为什么代码段分为这三种。
所谓“代码段”就是一段文本形式的代码。
首先,全局代码是一种,这个应该没有非议,本来就是手写文本到<script>标签里面的。

其次,eval代码接收的也是一段文本形式的代码。

最后,函数体是代码段是因为函数在创建时,本质上是 new Function(…) 得来的,其中需要传入一个文本形式的参数作为函数体。

这样解释应该能理解了。
最后,eval不常用,也不推荐大家用。
下一节我们介绍函数的情况,并一起总结一下执行上下文到底包含哪些内容。敬请期待。

深入理解javascript原型和闭包(8)——简述【执行上下文】上相关推荐

  1. 深入理解javascript原型和闭包(16)——完结

    之前一共用15篇文章,把javascript的原型和闭包. 首先,javascript本来就"不容易学".不是说它有多难,而是学习它的人,往往都是在学会了其他语言之后,又学java ...

  2. 深入理解javascript原型和闭包(17)——补this

    本文对<深入理解javascript原型和闭包(10)--this>一篇进行补充,原文链接:http://www.cnblogs.com/wangfupeng1988/p/3988422. ...

  3. 深入理解javascript原型和闭包(3)——prototype原型

    既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...

  4. 深入理解javascript原型和闭包(2)——函数和对象的关系

    上文(理解javascript原型和作用域系列(1)--一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...

  5. 深入理解javascript原型和闭包(9)——简述【执行上下文】下

    继续上一篇文章的内容. 上一篇我们讲到在全局环境下的代码段中,执行上下文环境中有如何数据: 变量.函数表达式--变量声明,默认赋值为undefined: this--赋值: 函数声明--赋值: 如果在 ...

  6. 深入理解javascript原型和闭包

    原文链接http://www.cnblogs.com/wangfupeng1988/p/3977924.html 对象是属性的集合. function show(x) {console.log(typ ...

  7. 深入理解JavaScript原型与闭包

    说明 本文为作者学习记录相关笔记及理解,如有不妥之处,请各位读者积极指出, 虽然标题是深入理解,但可能存在许多不够深入的地方,请各位小伙伴不吝赐教 一切都是对象 一切引用类型都是对象,对象是属性的集合 ...

  8. 深入理解javascript原型和闭包(15)——闭包

    前面提到的上下文环境和作用域的知识,除了了解这些知识之外,还是理解闭包的基础. 至于"闭包"这个词的概念的文字描述,确实不好解释,我看过很多遍,但是现在还是记不住. 但是你只需要知 ...

  9. 深入理解javascript原型和闭包(12)——简介【作用域】

    提到作用域,有一句话大家(有js开发经验者)可能比较熟悉:"javascript没有块级作用域".所谓"块",就是大括号"{}"中间的语句. ...

最新文章

  1. 200 万年薪,却招不到清华姚班毕业生!能上姚班的都是什么人?
  2. Java调用python脚本
  3. 网络编程释疑之:TCP的TIME_WAIT状态在服务器开发中的影响?
  4. selenium动态网页爬虫复习
  5. Mybatis-plus 将字段更新为null
  6. 国内外邮箱、邮件服务大全 常见+非主流+免费+加密+域名邮箱
  7. 5.郝斌C语言笔记——运算符
  8. c++11总结19——std::mutex
  9. 史上最简单的spark教程第十三章-SparkSQL编程Java案例实践(终章)
  10. 网页复制内容修改(解决复制文本多空格问题,带标注信息(如版权信息))
  11. 购买云服务器如何选择cpu与内存搭配
  12. Processing Arduino 音频频谱显示
  13. 关于数据库中FK的简单理解以及应用
  14. kafka计算机专业读法_计算机专业有哪些行之有效的学习方法?
  15. Blender2.8安装Armory3D插件
  16. 马斯克预计特斯拉电动皮卡今夏发布 此前暗示起售价低于5万美元
  17. Qt使用QSocket做tcp简单客户端
  18. 用STM32定时器中断产生PWM控制步进电机
  19. RabbitMq消费消息
  20. 一级消防工程师前景真的不好了?

热门文章

  1. 解决nginx 504 Gateway Time-out的一些方法
  2. Thinkphp下嵌套UEditor富文本WEB编辑器
  3. Yii的gii-modules
  4. mysql set schema_Mysql数据库优化学习之一 Schema优化
  5. git批量删除没用的远程分支
  6. MySQL中的find_in_set
  7. windows常用的几个操作
  8. mysql-5.6.16-win32_mysql-5.6.16-win32免安装配置方法
  9. swiper用loop不出图片_swiper实现双向控制
  10. mysql经典总结文章_MySQL基础篇(01):经典实用查询案例,总结整理