JavaScript作用域学习笔记
重点知识点摘要
一
函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性
其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。
从作用域链的结构可以看出,在运行期上下文的作用域链中,标识符所在的位置越深,读写速度就会越慢。如上图所示,因为全局变量总是存在于运行期上下文作用域链的最末端,因此在标识符解析的时候,查找全局变量是最慢的。所以,在编写代码的时候应尽量少使用全局变量,尽可能使用局部变量。一个好的经验法则是:如果一个跨作用域的对象被引用了一次以上,则先把它存储到局部变量里再使用。
JavaScript 开发进阶:理解 JavaScript 作用域和作用域链
二
JS权威指南中有一句很精辟的描述: ”JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.”
任何执行上下文时刻的作用域, 都是由作用域链(scope chain)来实现.
函数对象的[[scope]]属性是在定义一个函数的时候决定的, 而非调用的时候
在调用函数执行之前, 会首先创建一个活动对象, 然后搜寻这个函数中的局部变量定义,和函数定义, 将变量名和函数名都做为这个活动对象的同名属性, 对于局部变量定义,变量的值会在真正执行的时候才计算, 此时只是简单的赋为undefined.
- <script>
- alert(typeof eve); //结果:function
- alert(typeof walle); //结果:undefined
- function eve() { //函数定义式
- alert('I am Laruence');
- };
- var walle = function() { //函数表达式
- }
- alert(typeof walle); //结果:function
- </script>
在JS中, 是有预编译的过程的, JS在执行每一段JS代码之前, 都会首先处理var关键字和function定义式(函数定义式和函数表达式).
摘要出处 Javascript作用域原理 单纯看这几句话难以理解,最好看看作者的例子
最新文章
- cglib动态代理
- SQL Server 不清空数据,修改数据库字段、结构,阻止保存要求重新创建表的更改
- Mac OS X【快捷键组合】汇总
- VDN For PB Web实现消息推送
- ParentWindow属性及其一系列函数的作用——适合于那些不需要父控件管理内存释放的子控件
- [转]:如何使用Android Studio把自己的Android library分享到jCenter和Maven Central
- js控制div显示与隐藏
- 【技术干货】git常用命令
- 新概念英语(1-59)Is that all
- 解决 Docker Image的UTF-8中文字符集的问题(以Oracle为例)
- B2B、B2C、C2C、O2O
- Window 包管理工具: chocolatey
- sql语句的各种模糊查询语句
- 控制台直接执行sql语句
- 使用JavaScript动态更改CSS样式
- DALSA网口线扫相机SDK开发详解例程(C#版)
- http协议与soap协议区别
- linux c MQTT客户端实现
- HTML中input和button设置同样高度却不能等高的原因
- CentOS7 wget 安装Redis,开机启动配置