JavaScript的语法要点 2 - Scope Chain
前文所述,JavaScript是基于词法作用域(lexically scoped)的,所以标识符被固定在它们被定义的作用域而不是语法上或是其被调用时的作用域。即全局变量的作用域是整个程序,局部变量的作用域是其所在的函数(包括函数的内嵌函数)。
根据JavaScript相关文档我们知道,当你定义一个全局变量时,其实你是为JavaScript的全局对象定义了一个属性(property);而当我们在函数体内定义一个局部变量时,其实也是为某个对象(这个对象与JavaScript的内部实现相关)定义了一个属性。
因此,从JavaScript的实现角度讲,每一个JavaScript函数(也包括全局代码)都有一个scope chain(作用域链)与之相关联。这个作用域链上是一系列的对象(object),每个对象的属性是相关作用域范围内的变量。JavaScript顺着这个作用域链去搜寻相关的变量定义。比如JavaScript需要知道变量x,那么它首先会寻找scope chain上的第一个对象,如果第一个对象中没有名字为x的属性,那么它继续向上搜索,知道找到为止。
于是,我们可以得出:全局代码的scope chain上只有一个对象 - 全局对象;非内嵌函数的scope chain上则有两个对象,第一个定义了函数的参数和本地局部变量,第二个则是全局对象;而内嵌函数的scope chain上则有三个以上的对象。
当函数被定义时,它的scope chain也会被定义,每当函数执行时,新的对象会添加到scope chain上,这个对象包含了本地变量的定义。但对于内嵌函数,则会比较奇特 - 因为每次外部函数被调用时,内嵌函数会被重新定义一次,因此它的scope chain也会被重新定义一次。
JavaScript的语法要点 2 - Scope Chain的更多相关文章
- JavaScript的语法要点 1 - Lexically Scoped Language
作为从一开始接触C.C++.C#的程序员而言,JavaScript的语法对我来说有些古怪,通过最近一年的接触,对它有了一定的了解,于是想把它的一些语法要点记录下来. 1. Block Scope vs ...
- JavaScript的语法要点 3 - Calling Context
上一篇讲了JavaScript的Scope Chain - 每一个函数都有一个scope chain与之关联,scope chain上有第一个对象维护着本地变量作为其属性.另外我们在JavaScrip ...
- JavaScript的语法要点 4 - 面向对象的基础
在传统的面向对象语言如C++.C#.Java中有类.对象.继承等概念.在JavaScript中又如何表示呢?JavaScript中没有class关键字,JavaScript中的类.对象.继承的概念是通 ...
- 深入理解JavaScript系列(14):作用域链(Scope Chain)
前言 在第12章关于变量对象的描述中,我们已经知道一个执行上下文 的数据(变量.函数声明和函数的形参)作为属性存储在变量对象中. 同时我们也知道变量对象在每次进入上下文时创建,并填入初始值,值的更新出 ...
- (翻译) How variables are allocated memory in Javascript? | scope chain | lexicial scope
总结: 阅读下面文章需要15分钟 提问者的问题是JavaScript中内存是怎么分配的,在介绍的过程作者涉及计到了JS中 Scope Chain和调用函数call生成lexicial environm ...
- 【repost】JavaScript 基本语法
JavaScript 基本语法,JavaScript 引用类型, JavaScript 面向对象程序设计.函数表达式和异步编程 三篇笔记是对<JavaScript 高级程序设计>和 < ...
- JS -- The Scope Chain 作用域链
The Scope Chain JavaScript is a lexically scoped language: the scope of a variable can be thought of ...
- 你不知道的JavaScript--Item20 作用域与作用域链(scope chain)
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...
- The Scope Chain
JavaScript is a lexically scoped language: the scope of variable can be thought of as the set of sou ...
随机推荐
- nginx+tomcat动静分离的核心配置
#所有jsp的页面均交由tomcat或resin处理 location ~ .(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_head ...
- 离线安装Cloudera Manager5.3.4与CDH5.3.4(二)
Cloudera Manager Server和Agent所有后发先至.也能够进行CDH5的安装和配置. 然后,主节点可以通过浏览器访问7180port测试(因为CM Server需要花时间来启动,可 ...
- Clover
为您的 Windows Explorer 插上翅膀! Clover 是 Windows Explorer 资源管理器的一个扩展,为其增加类似谷歌 Chrome 浏览器的多标签页功能. 方便的 Tab ...
- android122 zhihuibeijing 主页面搭建
右边主页面布局设计: 文字颜色选择器和是否点击的图片选择器 路径和写法: <?xml version="1.0" encoding="utf-8"?&g ...
- win7系统升家庭版级为旗舰版的方法
在使用的便利性上,两者没有太大差别,不过有些高级功能是家庭版所没有的,所以我们很多人都希望升级为旗舰版,那么我们需要重新安装系统吗?显然没有这么麻烦,我们只需要简单的几个步骤即可. 步骤/方法 ...
- h5拖放-基础知识
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Objective-C中NSArray和NSMutableArray是如何使用的?
Objective-C的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象.但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才 ...
- MAC 环境下初始化mysql root 密码
1. 关掉mysql服务,打开系统设置最后的mysql,然后将mysql先关掉 2. 生成一个文件命名mysql-init,文件中放入:一句话,这句话不同版本不一样,如下:(括号里面不包含) alte ...
- setTimeout和setImmediate以及process.nextTick的区别
在javascript中我们了解到了setTimeout和setInterVal函数事件队列(任务队列)的相关知识,除了setTimeout和setInterval这两个方法外,Node.js还提供了 ...
- [转]在.Net中使用Oracle的表类型和对象类型
本文转自:http://www.cnblogs.com/studyzy/archive/2010/10/13/1850161.html 在一般的数据存取操作过程中,如果要对一个主表和对应的子表进行插入 ...