4.2 Javascript之执行环境和作用域
执行环境
每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
//书中说我们自己编写的代码无法访问这个对象
//下面这个最外层的执行环境window对象是可以访问的呢???
web浏览器中,最外层的执行环境是window对象,因此所有的全局变量和函数都是作为window的属性或者方法创建的
作用域链
作用域链的用途是保证执行环境对有权限访问的变量和函数的有序访问
作用域链的前端都是当前执行代码所在环境的变量对象
如果这个环境是函数,则将其活动对象作为变量对象,活动对象在一开始的时候只包含了arguments对象,作用域链中的下一个变量对象来自于包含(外部)环境,再下一个变量对象则来自于下一个包含(外部)对象。。。一直延伸到全局执行环境(全局执行环境的变量对象始终是作用域链中的最后一个对象)
var globalColor = "globalColor"; function globalFunc(){ //这里能访问函数里的变量和方法,但是不能访问innerFunc函数里的变量 var globalColor = "globalFuncColor"; function innerFunc(){ //这里可以访问此函数里的所有变量和方法,还有外部的所有变量和方法 var innerFuncColor = "innerFuncColor"; var globalColor = "globalColor-innerFuncColor"; innerFuncColor = globalColor; console.log(innerFuncColor) } console.log(globalColor) innerFunc(); } globalFunc(); console.log(globalColor) //globalFuncColor //globalColor-innerFuncColor //globalColor //优先访问当前执行代码环境的变量对象
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
延长作用域链
执行环境的类型:全局和局部(函数)
function buildUrl(){ var href = "test.com"; with(location){ var res = href + href; } return res; } buildUrl(); //width里的href代表的是location.href,所以结果里并没有"test.com"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
try{ console.log(myTest) }catch(ex){ console.dir(ex.message); }; // 对于捕获来说会创建一个新的变量对象,包含的是被抛出来的错误对象的声明 // 意思应该是新创建的执行环境下可以访问到抛出的错误对象
- 1
- 2
- 3
- 4
- 5
- 6
- 7
无块级作用域
for(var i = 0; i < 10; i++){ console.log(i); } console.log("now i is: " + i); //now i is 10 //变量i定义在for循环里面,循环结束后,还是可以访问到变量i,并没有销毁
- 1
- 2
- 3
- 4
- 5
- 6
变量查找
var color = "red"; function getColor(){ return color; } console.log(getColor()) //调用getColor函数时,返回color变量的值,首先会在getColor函数的作用域内查找color变量 //没有找到变量,就会沿着作用域链继续向上层的作用域查找,找到就返回变量的值 //否则会一直向上查找至window全局作用域,如果全局作用域下查找不到,则就表明变量未声明 //优先返回局部作用域下的同名变量
原文发布时间:2018年03月15日
本文来源CSDN博客如需转载请紧急联系作者
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java 9 的9个特性
Java 8 发布三年多之后,即将快到2017年7月下一个版本发布的日期了。 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新。 这里有九个令人兴奋的新功能将与 Java 9 一起发布。 Java 平台级模块系统 Java 9 的定义功能是一套全新的模块系统。当代码库越来越大,创建复杂,盘根错节的“意大利面条式代码”的几率呈指数级的增长。这时候就得面对两个基础的问题: 很难真正地对代码进行封装, 而系统并没有对不同部分(也就是 JAR 文件)之间的依赖关系有个明确的概念。每一个公共类都可以被类路径之下任何其它的公共类所访问到, 这样就会导致无意中使用了并不想被公开访问的 API。此外,类路径本身也存在问题: 你怎么知晓所有需要的 JAR 都已经有了, 或者是不是会有重复的项呢? 模块系统把这俩个问题都给解决了。 模块化的 JAR 文件都包含一个额外的模块描述器。在这个模块描述器中, 对其它模块的依赖是通过 “ requires” 来表示的。另外, “ exports” 语句控制着哪些包是可以被其它模块访问到的。所有不被导出的包默认都封装在模块的里面。如下是一...
- 下一篇
经典算法详解(11)递归查找数组中的最大值
题目:编写一个程序,用递归的方法实现查找数组中的最大值。 C++实现 1 #include<iostream> 2 3 using namespace std; 4 //第一种方法是常规方法,不是使用递归,首先将第一个元素的值赋值给max,然后遍历数组, 5 //当遇到超高max的值时将其赋值给max,最后就将得到最大值 6 int getMax_fir(int *arr,int n) { 7 int max = arr[0]; 8 for (int i = 1; i < n; i++) { 9 if (max < arr[i]) 10 max = arr[i]; 11 } 12 return max; 13 } 14 15 //第二种方法是使用递归,递归就是讲大规模问题转成小规模的相同问题,将数组看成第一个元素与后面的数组的最大值作比较, 16 //后面的数组求最大值又可以看成它的第一个元素与后面的数组最大值比大小,以此类推性,形成递归 17 int getMax_sec(int *arr, int n) { 18 if (n == 1) //设置终止条件 1...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- CentOS8编译安装MySQL8.0.19
- CentOS7设置SWAP分区,小内存服务器的救世主
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题