javascript痛点之二作用域链
1.执行环境(执行上下文)
先看段代码
var a = 10;
var b = 20;
function cc(){
var c = 30;
alert("b="+b);
}
cc();
alert(c);//报错
为什么我们在函数cc中可以访问到全局变量b而外部却访问不了局部变量c呢?
这就是执行环境的作用:它定义了变量或函数是否有权访问其他数据,决定各自行为。
在javascript中有三种可执行的类型
1.Global Code,即全局的、不在任何函数里面的代码,例如:一个js文件、嵌入在HTML页面中的js代码等。
2.Eval Code,即使用eval()函数动态执行的JS代码。
3. Function Code,即用户自定义函数中的函数体JS代码。
不同的类型有不同的执行环境,我们只讨论全局执行环境和函数执行环境
2.每一个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中

在这个方框里就是一个大的执行环境对应的有一个变量对象,这个变量对象我们在程序中是没法访问它的,那它的作用是什么呢?
我们定义的变量a,b,函数cc都是定义在变量对象(variable Object),后台在解析的时候是解析的变量对象的,这就是变量对象的概念。
3.作用域链
看段代码
//执行环境window对象(最上层的执行环境)
var color1 = "blue";
function changeColor(){ //每一个函数都有一个执行环境
var color2 ="red";
function swapColor(){
var color3 = color2;
color1 = color3;
//这里可以访问color1,2,3
}
//这里可以访问color1,color2,但不可以访问color3
swapColor();
}
//这里只能访问color1
changeColor();//第一个作用环境 changeColor是最外层的window作用域,
在上面的大的执行环境中,可以看到变量color1和函数changeColor,执行changeColor(),代码会从color2代码开始执行到完毕。
当代码执行到swapColor函数的时候,这个函数又产生了一个执行环境(因为每一个函数都有一个执行环境),
当执行到 var color3 = color2;代码中就相当于
var color2 ="red";
function swapColor(){
var color3 = color2;
color1 = color3;
//这里可以访问color1,2,3
}
color2是全局变量所以函数swapColor可以访问到。
当访问到swapColor()是不可以访问到color3的。
所以我们就得出一个作用域链的概念
当我们的执行环境依次执行到changeColor和swapColor时会产生一个链条,这个链条决定了整个变量的访问权限
环境变量一层一层的向上进行追溯,可以访问它的上级环境(变量和函数)
这就是作用域链的概念
就是一层一层的向上找
c3可以访问c2也可以访问c1 但不能向下访问 。
假设c1是一级作用域,c2是二级作用域,c3是三级作用域
在c3中访问c1它会怎么做呢
1.先在swapColor函数内查找c1 结果没有发现c1
2.继续向上查找
3.发现c2作用域还是没发现c1
4.继续向上查找
5.找到c1
(完
下一章
javascript痛点之三闭包
javascript痛点之二作用域链的更多相关文章
- javascript深入理解-从作用域链理解闭包
一.概要 红宝书(P178)对于闭包的定义:闭包就是有权访问另外一个函数作用域中变量的函数. MDN,对于闭包的定义:闭包就是指能够访问自由变量的函数. 那么什么是自由变量?自由变量就是在函数中使用, ...
- Javascript 运行上下文和作用域链
一.作用域Scope和上下文Context 在javascript中,作用域scope和上下文context是两个不同的概念.每个函数调用都会伴随着scope和context,从本质上来说,scope ...
- 深度剖析Javascript执行环境、作用域链
一.执行环境 执行环境(也叫做执行上下文,Execution Context)是Javascript中最为重要的一个概念.执行环境定义了变量或函数有权访问其他数据,决定了它们各自的行为.每个执行环境都 ...
- JavaScript 执行环境以及作用域链
执行环境(execution context,为简单起见,有时也称为"环境")是 JavaScript 中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们 ...
- JavaScript高级程序设计之作用域链
JavaScript只有函数作用域:每个函数都有个作用域链直达window对象. 变量的查找由内而外层层查找,找到即止. 同时不仅可以查找使用,甚至可以改变外部变量. var color = &quo ...
- Javascript中闭包的作用域链
作用域定义了在当前上下文中能够被访问到的成员,在Javascript中分为全局作用域和函数作用域,通过函数嵌套可以实现嵌套作用域. 闭包一般发生在嵌套作用域中.闭包是JavaScript最强大的特性之 ...
- javaScript执行环境、作用域链与闭包
一.执行环境 执行环境定义了变量和函数有权访问的其他数据,决定了他们各自的行为:每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.虽然我们编写的代码无法访问这个对象 ...
- 【进阶2-2期】JavaScript深入之从作用域链理解闭包(转)
这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://github.com/yygmind/blog/issues/18 红宝书(p178)上对于闭包的定义:闭包是指有权访问另外一 ...
- javascript 执行环境,作用域链和闭包
首先看下这条语句: (function($) {…})(jQuery): 1.原理: function(arg){…}这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写上括号和实参的, ...
随机推荐
- Elasticsearch搜索之best_fields分析
顾名思义,best_field就是获取最佳匹配的field,另个可以通过tie_breaker来控制其他field的得分,boost可以设置权重(默认都为1). 下面从宏观上来讲的简单公式: scor ...
- openssl命令行-证书认证
命令1: openssl genrsa -out root.key 1024 产生一个root.key的私钥 命令2: openssl req -key root.key -new -out ro ...
- CF #Manthan, Codefest 16 C. Spy Syndrome 2 Trie
题目链接:http://codeforces.com/problemset/problem/633/C 大意就是给个字典和一个字符串,求一个用字典中的单词恰好构成字符串的匹配. 比赛的时候是用AC自动 ...
- 关于定时发送服务的解决办法(PHP)
一.定时发送任务解析 在进行手机APP或者微信开发的时候,经常会有需要定时推送消息的场景. 定时发送又分为两种: 一种是在开发的时候固定时间,后台管理人员只能选择将要推送的消息: 另一种是后台管理人员 ...
- DbVisualizer:Oracle触发器,解决ORA-04098: 触发器 'USER.DECTUSERTEST_TRI' 无效且未通过重新验证
我没有用orcal的管理工具,而是用的DbVisualizer 9.5.2,管理数据库. 场景:需要在oracle里面实在自增字段,在网上一搜一堆文档,然后自己就找了一段自己写如下: drop tab ...
- hibernate 对象三态(瞬态、持久态、脱管态)之我见
刚开始学习hibernate时,对其对象的三种状态理解的模模糊糊,一直停留在一知半解的状态,前两天又回顾了一下,顿时醒悟,原来三种状态理解起来是很容易的. 先看一下对Hibernate对象状态的解释: ...
- linux网络设置和虚拟机克隆转移之后Error:No suitable device found:no device found for connection 'System eth0'问题解决
以root用户登录 #vi /etc/sysconfig/network-scripts/ifcfg-eth0 #编辑配置文件,添加修改以下内容 BOOTPROTO=static #启用 ...
- anjular中Service、Factory、Provider的使用与js中创建对象的总结
在学习anjular中Service的使用时,发现和js中的创建对象的方式有一定的联系,所以总结了anjular中Service.Factory.Provider的使用方式与js创建对象的方式 一.先 ...
- ScheduledFuture和RunnableScheduledFuture详解
ScheduledFuture java.util.concurrent 接口 ScheduledFuture<V> 类型参数: V - 此 Future 返回的结果类型. 所 ...
- JSP页面的静态包含和动态包含
JSP中有两种包含:静态包含:<%@include file="被包含页面"%>和动态包含:<jsp:include page="被包含页面" ...