深入浅出: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 ...
随机推荐
- 团队作业4——第一次项目冲刺(Alpha版本)6th day
一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 24点的游戏输入是点击我们给的图片然后会输入相应的数字,之前的所做的出 现了一点问题,在把数字删掉重新输入就不行,这个问题仍然 ...
- 201521123105 第8周Java学习总结
1.本周学习总结 1.1思维导图 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 1.删除元素的时候从最后一个元素开始,避免删除元素后位置发生变化而导致 ...
- 201521123097《Java程序设计》第六周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1.clone方法 1.1 Object对 ...
- update:我的Emacs配置文件
;;设置字体用的 防止中文变成无法识别的框框 (set-default-font "Consolas-11") (set-fontset-font "fontset-d ...
- 201521123057 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- 201521123068 《java程序设计》 第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 多线程的冲突:同时运行的线程需要访问共享数据(临界资源) 多线程的互斥访问:两个或两个以上的线程需要同时对同一数据 ...
- POJ 3190 Stall Reservations (优先队列)C++
Stall Reservations Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7646 Accepted: 271 ...
- 03标准对象-02-RegExp 正则表达式
1.基本概念 和 定义 用一种描述性的语言来给字符串定义一个规则,你可以形象地理解正则表达式是一个"框",凡是符合大小形状条件的字符串,都算是"匹配"了. JS ...
- eastcom——eclipse中运行vtmserver项目
1, vtmserver项目必须在tomcat7上运行. 2, 在Eclipse中vtmserver的截图 3, 在eclipse中配置一个tomcat7并将vtmserver加入其中 4, 在ecl ...
- (一)关于java泛型的学习总结(泛型方法、泛型擦除)
目录概要 一.泛型方法 二.利用泛型方法的特性实现代码的简化 三. 关于泛型的擦除 四.无界通配符和原生类型区别 五.转型和警告 泛型 一般的类中的属性或方法的参数,只能使用具体的类型:要么是基本 ...