重点知识点摘要

函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性

其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。

从作用域链的结构可以看出,在运行期上下文的作用域链中,标识符所在的位置越深,读写速度就会越慢。如上图所示,因为全局变量总是存在于运行期上下文作用域链的最末端,因此在标识符解析的时候,查找全局变量是最慢的。所以,在编写代码的时候应尽量少使用全局变量,尽可能使用局部变量。一个好的经验法则是:如果一个跨作用域的对象被引用了一次以上,则先把它存储到局部变量里再使用。

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链

JS权威指南中有一句很精辟的描述: ”JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.”

任何执行上下文时刻的作用域, 都是由作用域链(scope chain)来实现.

函数对象的[[scope]]属性是在定义一个函数的时候决定的, 而非调用的时候

在调用函数执行之前, 会首先创建一个活动对象, 然后搜寻这个函数中的局部变量定义,和函数定义, 将变量名和函数名都做为这个活动对象的同名属性, 对于局部变量定义,变量的值会在真正执行的时候才计算, 此时只是简单的赋为undefined.

  1. <script>
  2. alert(typeof eve); //结果:function
  3. alert(typeof walle); //结果:undefined
  4. function eve() { //函数定义式
  5. alert('I am Laruence');
  6. };
  7. var walle = function() { //函数表达式
  8. }
  9. alert(typeof walle); //结果:function
  10. </script>

在JS中, 是有预编译的过程的, JS在执行每一段JS代码之前, 都会首先处理var关键字和function定义式(函数定义式和函数表达式).

摘要出处  Javascript作用域原理 单纯看这几句话难以理解,最好看看作者的例子

最新文章

  1. cglib动态代理
  2. SQL Server 不清空数据,修改数据库字段、结构,阻止保存要求重新创建表的更改
  3. Mac OS X【快捷键组合】汇总
  4. VDN For PB Web实现消息推送
  5. ParentWindow属性及其一系列函数的作用——适合于那些不需要父控件管理内存释放的子控件
  6. [转]:如何使用Android Studio把自己的Android library分享到jCenter和Maven Central
  7. js控制div显示与隐藏
  8. 【技术干货】git常用命令
  9. 新概念英语(1-59)Is that all
  10. 解决 Docker Image的UTF-8中文字符集的问题(以Oracle为例)
  11. B2B、B2C、C2C、O2O
  12. Window 包管理工具: chocolatey
  13. sql语句的各种模糊查询语句
  14. 控制台直接执行sql语句
  15. 使用JavaScript动态更改CSS样式
  16. DALSA网口线扫相机SDK开发详解例程(C#版)
  17. http协议与soap协议区别
  18. linux c MQTT客户端实现
  19. HTML中input和button设置同样高度却不能等高的原因
  20. CentOS7 wget 安装Redis,开机启动配置

热门文章

  1. 制作图片边框:《CSS3 Border-image》
  2. [问题2014S06] 解答
  3. DataGridView单元格美化
  4. phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
  5. js数组的一些操作
  6. 解决打开CHM文件后,右侧空白
  7. Json不知道key值情况下获取第一个键值对
  8. 不支持关键字“metadata”问题的解决方法
  9. python走起之第三话
  10. WebSocket实战之————GatewayWorker使用笔记例子