深入浅出:JavaScript作用域链
1. 什么是作用域
任何程序设计语言都有作用域的概念,简单的说,作用域就是变量的作用范围。
2. 变量的分类和变量作用域的分类
在JavaScript中,变量分为全局变量和局部变量,与此相对应的,变量的作用域有全局作用域和局部作用域两种。
3. 全局变量和全局作用域
在函数外声明的变量为全局变量,全局变量所对应的作用域为全局作用域。看如下代码:
var globalEle = "世界这么大";
function func(){
console.log("函数内部:" + globalEle);
}
func();
console.log("函数外部:" + globalEle);
打印结果:

结果分析:
在函数外部声明了一个变量globalEle,因此它为全局变量,拥有全局作用域,全局变量无论在函数内部还是函数外部都可以被访问。
4. 局部变量和局部作用域
在函数内声明的变量为局部变量,局部变量所对应的作用域为局部作用域。看如下代码:
function func(){
var localEle = "而我在国内"
console.log("函数内部:" + localEle);
}
func();
console.log("函数外部:" + localEle);
打印结果:

结果分析:
在函数内部声明了一个变量localEle,因此它为局部变量,拥有局部作用域,局部变量只能在当前声明的函数内起作用,因此在函数外访问局部变量会提示not defined。
5. 什么是作用域链
作用域链的建立过程此处不详细讲,一些官网定义的抽象的概念也不多加以阐述,就通过下面的例子来看一下,看如下代码:
var ele = "函数外面定义的变量";
function func(){
var ele = "函数func内定义的变量";
function son(){
var ele = "函数son内定义的变量";
console.log(ele);
}
son();
}
func();
打印结果:

结果分析:变量ele被定义了三次,但他们的作用域不同,第一次定义的ele是全局变量,拥有全局作用域。第二次定义的ele是局部变量,在函数func内起作用,因为函数son是函数func的子函数,所以在函数son内也可以访问到这里定义的变量。第三次定义的ele也是局部变量,在函数son内部起作用。所以,在函数son内部访问变量ele也就是打印变量ele的时候,会依照就近原则先去访问函数son内部的定义的变量ele,如果找不到会一层层网上找,直到最上面一层,如果依旧找不到会提示not defined。希望你能通过这个简单的案例理解作用域链。
好啦,就说这么多咯,以上说法有不严谨之处还请各位指正,祝工作愉快!
深入浅出:JavaScript作用域链的更多相关文章
- JavaScript作用域链的理解
前言 作用域是JavaScript一个很重要的概念,想要学好JavaScript就需要理解javascript作用域和作用域链的工作原理.这篇文章对JavaScript作用域链和作用域链做一个简单的介 ...
- JavaScript 作用域链图具体解释
<script type="text/javascript"> /** * 作用域链: */ var a = "a"; function hao94 ...
- javascript深入浅出图解作用域链和闭包
一.概要 对于闭包的定义(红宝书P178):闭包就是指有权访问另外一个函数的作用域中的变量的函数. 关键点: 1.闭包是一个函数 2.能够访问另外一个函数作用域中的变量 文章首发地址于sau交流学习社 ...
- JavaScript作用域链
之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论都在说了解了作用域链和活动对象才能真正理解闭包,起初不以为然,后来在跟公司同事交流的时 ...
- 个人理解的javascript作用域链与闭包
闭包引入的前提个人理解是为从外部读取局部变量,正常情况下,这是办不到的.简单的闭包举例如下: function f1(){ n=100; function f2(){ alert(n); } retu ...
- javascript作用域链学习笔记
作用域链 "JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里." --权威指南 在JavaScript中,一切皆对象,包括函数.函数对象和其它对象 ...
- (好文推荐)一篇文章看懂JavaScript作用域链
闭包和作用域链是JavaScript中比较重要的概念,首先,看看几段简单的代码. 代码1: var name = "stephenchan"; var age = 23; func ...
- 深入javascript作用域链到闭包
我之前用过闭包,用过this,虽然很多时候知道是这么一回事,但是确实理解上还不够深入.再一次看javascript高级程序设计这本书时,发现一起很多疑难问题竟然都懂了,所以总结一下一些理解,难免有错, ...
- 图解 javascript 作用域链
还是之前那一段简单的javascript代码: window.onload=function(){ function sub(a,b){ return a-b; } var result=sub(10 ...
随机推荐
- 201521123062《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 多态定义:同种形态不同定义 类注释格式 继承,共同行为及属性 在instanceof检查过后 ...
- 201521123029《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 答:1.数据库定义:为了实现一定目的按某种规则组织起来的"数据"的"集合" ...
- Struts2第十一篇【简单UI标签、数据回显】
Struts2UI标签 Sturts2为了简化我们的开发,也为我们提供了UI标签-也就是显示页面的标签-.. 但是呢,Struts2是服务端的框架,因此使用页面的标签是需要在服务器端解析然后再被浏览器 ...
- Linux下识别分区文件系统类型
Linux下挂载文件系统有时候需要填写文件系统.但有的设备拿到手还不知道文件系统,这种情况,可以用 parted命令 # parted /dev/vda GNU Parted 3.2 Using /d ...
- 最小覆盖_KEY
最小覆盖(cover)..线段树 [题目描述] 给定 N 个区间[Li,Ri],需要你按照顺序选出一个区间序列使得[1,M]完全被覆盖.并且在选出来的序列中,某个区间[a,b]之前必须保证[1,a]都 ...
- #define WIN32_LEAN_AND_MEAN
不加载MFC所需的模块.用英语解释:Say no to MFC如果你的工程不使用MFC,就加上这句,这样一来在编译链接时,包括最后生成的一些供调试用的模块时,速度更快,容量更小.不过对于较大工程,MF ...
- hdu1556树状数组的区间更新单点查询
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu1251字典树递归算法
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Subm ...
- 利用百度地图WEB服务APIGeoCoding API批量地址解析
Geocoding API包括地址解析和逆地址解析功能: 地理编码:即地址解析,由详细到街道的结构化地址得到百度经纬度信息,例如:“北京市海淀区中关村南大街27号”地址解析的结果是“lng:116.3 ...
- 在CentOS7上通过RPM安装实现LAMP+phpMyAdmin过程全记录
在CentOS7上通过RPM安装实现LAMP+phpMyAdmin过程全记录 时间:2017年9月20日 一.软件环境: IP:192.168.1.71 Hostname:centos73-2.sur ...