什么是作用域链
来源:互联网 发布:画卡通人物的软件 编辑:程序博客网 时间:2024/05/24 06:56
:点上面关注免费学习前端知识!
JavaScript是基于词法作用域的语言:通过阅读包含变量定义在内的数行源码就能知道变量的作用域。全局变量在程序中始终都是有定义的。局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的。
如果将一个局部变量看做是自定义实现的对象的属性的话,那么可以换个角度来解读变量作用域。每一段JavaScript代码(全局代码或函数)都有一个与之关联的作用域链(scope chain)。这个作用域链是一个对象列表或者链表,这组对象定义了这段代码“作用域中”的变量。JavaScript需要查找变量x的值的时候(这个过程称做“变量解析”(variable resolution)),它会从链中的第一个对象开始查找,如果这个对象有一个名为x的属性,则会直接使用这个属性的值,如果第一个对象中不存在名为x的属性,JavaScript会继续查找链上的下一个对象。如果第二个对象依然没有名为x的属性,则会继续查找下一个对象,以此类推。如果作用域链上没有任何一个对象含有属性x,那么就认为这段代码的作用域链上不存在x,并最终抛出一个引用错误异常。
在JavaScript的最顶层代码中(也就是不包含在任何函数定义内的代码),作用域链由一个全局对象组成。在不包含嵌套的函数体内,作用域链上有两个对象,第一个是定义函数参数和局部变量的对象,第二个是全局对象。在一个嵌套的函数体内,作用域链上至少有三个对象。理解对象链的创建规则是非常重要的。当定义一个函数时,它实际上保存一个作用域链。当调用这个函数时,它创建一个新的对象来存储它的局部变量,并将这个对象添加至保存的那个作用域链上,同时创建一个新的更长的表示函数调用作用域的“链”。对于嵌套函数来讲,事情变得更加有趣,每次调用外部函数时,内部函数又会重新定义一遍。因为每次调用外部函数的时候,作用域链都是不同的。内部函数在每次定义的时候都有微妙的差别——在每次调用外部函数时,内部函数的代码都是相同的,而且关联这段代码的作用域链也不相同。
作用域链的概念对于理解with语句是非常有帮助的,同样对理解闭包的概念也至关重要。
完
看前端技术文章,就在Web前端精髓
- 什么是作用域链
- 什么是作用域及js编译原理
- 什么是Jikes,作用?
- [你所不知的JavaScript] 作用域和闭包 Chapter1: 什么是作用域
- 你不懂JS:作用域与闭包 第一章:什么是作用域?
- 什么是MMU,MMU的作用
- 什么是批处理文件?有什么作用?
- 什么是网关?网关的作用?
- 什么是PLL, PLL的作用
- 什么是网关?网关的作用?
- 什么是mov压敏电阻 保护作用
- 什么是servlet?有什么作用?
- 什么是重载?重载的作用?
- 什么是重写?重写的作用?
- 什么是网关及网关作用
- 什么是serialVersionUID,serialVersionUID的作用
- 什么是网关及网关作用
- 什么是PXE及PXE作用
- 嗯,第一篇csdn博客
- 预定义接口
- XListView+下拉刷新,上拉加载
- Spark Streaming之容错机制以及事务语义
- 反射访问类的私有属性对象的私有方法
- 什么是作用域链
- sogou输入法出现乱码
- IDEA初见---输出HelloWorld,并打包成jar包
- 360新版特性界面实现(2)
- 省份城市实现二级联动效果
- 红黑树(RB-tree)比AVL树的优势在哪?
- ubuntu下让python脚本可直接运行
- HTML隐藏域作用
- 模版方法模式