JS_高程4.变量,作用域和内存问题(2)执行环境及作用域
1.执行环境:执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为,
每个执行环境都有一个与之相关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
2.全局执行环境:
最外围的一个执行环境。在web浏览器中,全局执行环境被认为是window对象,因此所有的全局变量和函数都是作为window对象的属性和方法创建的。(某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁,全局执行环境直到应用程序退出,例如关闭网页或是浏览器时才会被销毁。)
3.作用域链:当代码在一个环境中执行时,会创建变量对象的一个作用域链,作用域链的用途是:保证对执行环境有权访问的所有变量和函数的有序访问。
作用域链的前端,始终都是当前执行的代码所在环境的变量对象,下一个变量对象来自包含(外部)环境,再下一个变量对象则来自下一个包含环境,这样一直延续到全局执行环境,全局执行环境的变量对象始终都是作用域链中的最后一个对象。
4.在局部作用域中定义的变量可以在局部环境中与全局变量互换使用。
eg:
var color="red";
function changeColor(){
var anotherColor="blue";
function swapColors(){
var tempColor=anotherColor;
anotherColor=color;
color=tempColor;
//这里可以访问到color,anotherColor,tempColor。
}
//这里可以访问到color,anotherColor,但是不能访问到tempColor。
swapColors();
}
//这里只能访问color
changeColor();
注意:
从以上代码可以看出,内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。环境之间的联系是线性,有次序的。每个环境都可以向上搜索作用域,以查询变量和函数名;但是任何环境都不能向下搜索而进入另一个环境。
5.延长作用域链
在作用域链的前端临时增加一个变量对象,带变量对象会在代码执行后被移除。
但执行流进入下列任一语句时,作用域链会被加长:try-catch语句的catch块,with语句。
6.没有块级作用域
在c语言中,由花括号封闭的代码都有自己的块级作用域,当相应的语句执行完毕后,块级作用域中定义的变量会被销毁。但是Javascript没有块级作用域,所以不会这样。
eg:
if(true){
var color="red";
}
alert(color);//"red"
eg:
for(var i=0;i<10;i++){
doSomething(i);
}
alert(i);//
注意:
那么当我们在JavaScript中需要创建一个临时作用域时,我们可以通过创建一个新函数并且在内部定义变量。
eg:
var color="red";
if(true){
(function(){
var color="pink";
alert(color);//pink
}());
}
alert(color);//red
可以与下面的例子形成对比,加深理解。
var color="red";
if(true){
var color="pink";
alert(color);//pink
} alert(color);//pink
(1)声明变量:使用var声明的变量会自动被添加到最近的环境中。没有使用var声明,该变量会自动被添加到全局变量中。
eg:
function add(num1,num2){
var sum=num1+num2;
return sum;
}
var result=add(10,20);
alert(result)
alert(sum);
结果:


注意:变量sum是函数内部定义的局部变量,在函数外部是访问不到的。
改为:
function add(num1,num2){
sum=num1+num2;
return sum;
}
var result=add(10,20);
alert(result)
alert(sum);
则sum也可以访问到。
(2)查询标识符
现在局部环境中查找,如果找不到再逐级向上查找,如果在全局变量中还是没有找到,就说明该变量尚未定义。
eg;
var color="red";
function getColor(){
return color;
}
alert(getColor());

eg:
var color="red";
function getColor(){
var color="blue";
return color;
}
alert(getColor());

注意:
eg:
var color="red";
function getColor(){ return color;
var color="blue";
}
alert(getColor());//undefined
如果是这样的顺序,由于JavaScript中变量的提升,其实该程序相当于下面的程序:
var color="red";
function getColor(){
var color;
return color;
color="blue";
}
alert(getColor());//undefided
变量的提升:把定义在后面的变量提升到前面中定义。注意提升的只是变量的声明,并不会把赋值也提升上去。
函数的提升:把整个函数提到前面。
(1)函数表达式:var foo=function foo(){.....}
(2)函数声明: function foo(){.....}
注意:只有函数声明的形式才能被提升。
eg:
function myTest(){
foo();
function foo(){ //函数提升成功
alert("hello");
}
}
myTest();
function myTest(){
foo();
var foo=function foo(){ //函数提升失败
alert("hello");
}
}
myTest();

把foo()调到后面就可以了:
function myTest(){
var foo=function foo(){
alert("hello");
}
foo();
}
myTest();
JS_高程4.变量,作用域和内存问题(2)执行环境及作用域的更多相关文章
- js中的执行环境及作用域
最近在面试时被问到了对作用域链的理解,感觉当时回答的不是很好,今天就来说说js中的作用域链吧. 首先来说说js中的执行环境,所谓执行环境(有时也称环境)它是JavaScript中最为重要的一个概念.执 ...
- 高程(4):执行环境、作用域、上下文执行过程、垃圾收集、try...catch...
高程三 4.2.4.3 一.执行环境 1.全局执行环境是最外层的执行环境. 2.每个函数都有自己的执行环境,执行函数时,函数环境就会被推入一个当前环境栈中,执行完毕,栈将其环境弹出,把控制器返回给之前 ...
- JavaScript 执行环境、作用域、内存管理及垃圾回收机制
前言 JavaScript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存. [原理]找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间间隔( ...
- javascript中函数的执行环境、作用域链、变量对象与活动对象
javascript高级程序设计中:对执行环境.作用域链.变量对象.活动对象的解释: 1.执行环境: 执行环境:有时也叫环境:是JavaScript中最为重要的一个概念:执行环境定义了变量或函数有权访 ...
- JavaScript中变量、执行环境、作用域与C#中的异同
首先需要明确一个执行环境的概念,执行环境这个概念是用来理解作用域的,在js中,执行环境分为全局执行环境和局部(function)执行环境,而在C#这类的C类语言中,还有一个块级别的执行环境,如if语句 ...
- 深入理解javascript作用域系列第五篇——一张图理解执行环境和作用域
× 目录 [1]图示 [2]概念 [3]说明[4]总结 前面的话 对于执行环境(execution context)和作用域(scope)并不容易区分,甚至很多人认为它们就是一回事,只是高程和犀牛书关 ...
- 【原】javascript执行环境及作用域
最近在重读<javascript高级程序设计3>,觉得应该写一些博客记录一下学习的一些知识,不然都忘光啦.今天要总结的是js执行环境和作用域. 首先来说一下执行环境 一.执行环境 书上概念 ...
- Javascript高级程序设计——执行环境与作用域
Javascript中执行环境是定义了变量或函数有权访问的其他数据,决定了各自的行为,每个执行的环境都有一个与之关联的变量对象,环境中定义的所以变量和函数都保存在这个对象中. 全局执行环境是最外围的一 ...
- JavaScript之一: 闭包、执行环境、作用域链
这是大虾的第一篇博文,大虾试图用最直白的语言去描述出所理解的东西,大虾是菜鸟,水平有限,有误的地方希望路过的朋友们务必指正,谢谢大家了. 从读书时代一路走来,大虾在学习的时候逐渐喜欢上了去追寻根源,这 ...
- 《JavaScript高级程序设计》读书笔记 ---执行环境及作用域
执行环境及作用域 执行环境(execution context,为简单起见,有时也称为“环境”)是JavaScript 中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们各自 ...
随机推荐
- select2插件 多选框动态初始化值
转自https://blog.csdn.net/yiyiwyf/article/details/53521980 上一篇讲了select2的多选和大标题设置. 这周做到了修改的功能,需要将旧数据的选项 ...
- python之多线程 queue 实践 筛选有效url
0.目录 1.背景 某号码卡申请页面通过省份+城市切换归属地,每次返回10个号码. 通过 Fiddler 抓包确认 url 关键参数规律: provinceCode 两位数字 cityCode 三位数 ...
- [转]GitHub for Windows 安装失败,An error occurred attempting to install github 的解决办法
解决办法: 只需要将 http://github-windows.s3.amazonaws.com/GitHub.application http改为https,然后在IE上打开,安装即可 问题如下 ...
- 【Android】Android自定义属性,attr format取值类型
1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name = "名称"> <attr name = &quo ...
- 没有IDE的日子
没有QT Creator,没有VS2008,没有Eclipse,也没有KDevelop,忘掉一切IDE. 好吧,现在我只有Vim了,可我跟Vim不熟. Vim魅力四射,光芒万丈,高高在上,她就是传说中 ...
- shell判断文件是否为空
[[ `cat a.log |wc -l` -eq 0 ]] && echo "file is empty"
- Centos创建定时任务和开机启动运行脚本
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArYAAADlCAIAAAAp5CPLAAAgAElEQVR4nNS8d3cj15nuW/wq91vc8d ...
- Python学习(二十九)—— pymysql操作数据库优化
转载自:http://www.cnblogs.com/liwenzhou/articles/8283687.html 我们之前使用pymysql操作数据库的操作都是写死在视图函数中的,并且很多都是重复 ...
- HDU4185 Oil Skimming 二分图匹配 匈牙利算法
原文链接http://www.cnblogs.com/zhouzhendong/p/8231146.html 题目传送门 - HDU4185 题意概括 每次恰好覆盖相邻的两个#,不能重复,求最大覆盖次 ...
- BZOJ1951 [Sdoi2010]古代猪文 中国剩余定理 快速幂 数论
原文链接http://www.cnblogs.com/zhouzhendong/p/8109156.html 题目传送门 - BZOJ1951 题意概括 求 GM mod 999911659 M=∑i ...