JS执行环境,作用域链及非块状作用域
JS中的执行环境,顾名思义就是变量或函数所执行时的环境。在我的理解中,执行环境和作用域相差不大。
每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行之后,
栈将其环境弹出,把控制权返回给当前的执行环境。简单点来说,就像C语言中的栈,当一个函数被运行时,它总是先运行
最内部的函数(也就是局部函数),再一层一层的向外部执行,就像一个栈一样,后进先出。
当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链好像一把梯子,最外层的(全局环境)永远是
最高那节梯子,每在上一个环境下增加一个变量对象,梯子下面就增加一节,就像一层一层嵌套下去。并且这梯子只能往上爬
不能往下走。
下面来看一个例子吧!
var color = "blue";
function changeColor(){
var anotherColor = "red";
function swapColor(){
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
//这里可以访问color,anotherColor,tempColor
}
//这里可以访问color和anotherColor和tempColor
SwapColors();
}
//这里只能访问color
changeColor();
在这个例子中实现了局部变量和全局变量互换使用。
以上代码共涉及了3个执行环境:全局环境、changeColor()的局部环境和swapColor()的局部环境。
该例子的作用域链如下:
window----
----color
----changeColor()
----anotherColor
----swapColor()
----tempColor
从该图可以很明显看出他们之间的嵌套关系。tempColor就是我所说的梯子中最下面的那一节,他可以一直往上爬
访问外部的变量,但外部的变量不能往下访问内部变量。就像color变量环境下不能访问anotherColor一样。
当然我们也可以通过某种手段来延长作用域链
我们可以使用try-catch语句的catch块;或者with语句来延长作用域链
例如:
function build(){
var qs = "hello";
width(location){
var url = href +qs;
}
return url;
}
在这里url变量可以下一个阶梯在with领域中使用。
接下来我们谈下JS中的非块级作用域
JS不想C、JAVA这类语言,JS是没有想它们那样有花括号括起来封闭的作用域。
接下来你看一个例子就会懂了
if(true){
var color = "blue"
}
alert(color); //"blue"
结果是不是让你大吃一惊,你一定会疑惑为什么if外也可以引用color变量。在for语句中也一样
for(var i=0;i<10;i++){
}
alert(i); //10
这2个语句在JS中很特殊,if语句中的变量会将变量添加到当前的执行环境中(也就是和if同一节中),也就是说可以在if同
阶环境中也可以使用color变量,但到了上一节执行环境中就不能使用color了,因为color在其下一节梯子了。for语句也类似。
JS中还有一个神奇的地方,就是声明变量。
使用var声明的变量和普通变量一样,只能在该阶执行环境中或下一阶执行环境中使用,不能在上一阶环境中使用
例如:
function add(num1.num2){
var sum = num1 + num2;
return sum;
}
var result = add(10,20); //30
alert(sum); //由于sum不是有效的变量,因此会导致错误
然而JS神奇之处就在于 当我们不用var声明一个变量时,该变量会自动被添加到全局变量环境中,也就是最高的那一节梯子中。
例如:
function add(num1.num2){
var sum = num1 + num2;
return sum;
}
var result = add(10,20); //30
alert(sum); //30
也就是说在我们调用玩add函数时,sum还没有被销毁,依旧保留下来,后面的代码依旧可以访问它。
JS执行环境,作用域链及非块状作用域的更多相关文章
- JS 执行环境与作用域链
1.执行环境 JavaScript 代码都是在执行环境中被执行的.执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域.生命周期等方面的处理,它定义了变量或函数是否有权访问其他数据 ...
- js执行环境、作用域
js执行环境.作用域 执行环境:是javascript中的一个重要的概念,<javascript高级程序设计第三版>的定义是:执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行 ...
- 浅谈JS执行环境及作用域
今天刚刚开通博客,也是第一次写博文,略感紧张.作为一个表达能力弱弱的人来说,自己花三分钟理解一个知识点,当别人问起时,也许需要30分钟才只是让别人知道自己在说什么,一点也不夸张,希望在博客上可以练习 ...
- JavaScript 执行环境(执行上下文) 变量对象 作用域链 上下文 块级作用域 私有变量和特权方法
总结自<高程三>第四章 理解Javascript_12_执行模型浅析 JS的执行环境与作用域 javascript高级程序第三版学习笔记[执行环境.作用域] 在javascript ...
- 【repost】 原生JS执行环境与作用域深入理解
首先,我们要知道执行环境和作用域是两个完全不同的概念. 函数的每次调用都有与之紧密相关的作用域和执行环境.从根本上来说,作用域是基于函数的,而执行环境是基于对象的(例如:全局执行环境即window对象 ...
- js执行环境相关
Js执行过程 如果一个文档中存在多个代码段 步骤一:读入第一个代码段(js引擎并非一行一行执行,而是一段一段分析执行) 步骤二:做词法分析和语法分析,有错则报语法错误(比如括号不匹配等),并跳转到步骤 ...
- js执行环境的深入理解
第一个例子中 :之所以每个函数都返回不同的值的原因 有2点 (简写如下文) 就是[SCOPE]内部属性,函数可能拥有相同的父作用域时,多个函数引用同一个[SCOPE]属性,所以return i的值还是 ...
- js执行环境深入研究
js 声明函数是创建函数对象的过程,当创建函数对象时,函数对象的[[scope]] =连当前执行环境对象的作用域(栈顶执行环境--当执行函数时,js会将该函数的执行环境对象入栈) 当为全局函数时,如: ...
- js执行环境的周边概念
一.熟悉几个名词: 1.执行环境(execution context),也叫执行上下文,每个函数都会有自己的执行环境:当浏览器首次加载脚本时,他将默认进入全局执行环境:如果接下来要调用一个内部函数,则 ...
随机推荐
- 极速创建 IOS APP !涛舅舅苹果 IOS APP自助生成系统!不用证书、不用越狱、永久可用
不用签名将网页封装成苹果APP,无需苹果企业签名,IPA签名,ios签名,免越狱安装 (本方法只支持网站封装app,原生的用不了,详细请咨询客服) 近期很多朋友问我把网站变成app的方法,原因很多种, ...
- MyBatis返回map数据
(1)接口中编写方法 //单行 public Map<String, Object> getEmpReturnMap(Integer id); //多行 @MapKey("id& ...
- linux crontab 执行mysqldump全局备份为空
今天遇到个问题,在定时备份时 去查看备份文件,发现大小竟然为0,执行 备份sh文件备份, 备份的sql文件大小正常.试了几种办法. 最终解决办法: 问题原因: 因为我设置的环境变量 就直接在sh中 使 ...
- js的七大设计原则--迪米特原则
一.什么是迪米特原则 迪米特原则也叫最少知道原则,一个类应该对其他对象保持最少的了解.通俗来讲,就是一个类对自己依赖的类知道的越少越好.因为类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另 ...
- 4.DHCP与PRE
如何配置IP地址 使用net-tools $ sudo ifconfig eth1 10.0.0.1/24 $ sudo ifconfig eth1 up 使用Iproute2 ...
- gradle环境变量设置_配置注意事项
看<Spring源码深度解析>的时候,在windows7系统中按照书里配置gradle环境变量,配置完后输入gradle -v,一直显示:'gradle'不是内部或外部命令,也不是可执行的 ...
- MyEclipse 10 报错记录
1. js文件:右键 >> MyEclipse >> Exclude From Validation 2. Servlet 警告:Window ==> Preferenc ...
- 移动端web开发的注意点大总结
对于手机网站建设,总结了如下几点注意: 1. 安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作 ...
- 作为小白,如何学习Web前端开发?
作为一个已经写码这么多年的人,我不会告诉你我最初的时候是自学的,因为刚开始自己学真的特别无聊枯燥,实在学不下去,所以就自己报了一个培训(上元教育)的地方,毕竟是交了钱的,本着不服气的精神,硬是把自己生 ...
- AIO系列文档(1)----图解ByteBuffer
因何而写 网上关于bytebuffer的文章真的很多,为何在此还要写一篇呢?主要是基于以下几点考虑 很多人在使用t-io时,还不会bytebuffer,只会照着t-io提供的例子照猫画虎,不利于灵活运 ...