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)执行环境及作用域的更多相关文章

  1. js中的执行环境及作用域

    最近在面试时被问到了对作用域链的理解,感觉当时回答的不是很好,今天就来说说js中的作用域链吧. 首先来说说js中的执行环境,所谓执行环境(有时也称环境)它是JavaScript中最为重要的一个概念.执 ...

  2. 高程(4):执行环境、作用域、上下文执行过程、垃圾收集、try...catch...

    高程三 4.2.4.3 一.执行环境 1.全局执行环境是最外层的执行环境. 2.每个函数都有自己的执行环境,执行函数时,函数环境就会被推入一个当前环境栈中,执行完毕,栈将其环境弹出,把控制器返回给之前 ...

  3. JS 执行环境与作用域链

    1.执行环境 JavaScript 代码都是在执行环境中被执行的.执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域.生命周期等方面的处理,它定义了变量或函数是否有权访问其他数据 ...

  4. JS执行环境,作用域链及非块状作用域

    JS中的执行环境,顾名思义就是变量或函数所执行时的环境.在我的理解中,执行环境和作用域相差不大. 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中.而在函数执行之后 ...

  5. JavaScript 执行环境、作用域、内存管理及垃圾回收机制

    前言 JavaScript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存. [原理]找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间间隔( ...

  6. JavaScript中变量、执行环境、作用域与C#中的异同

    首先需要明确一个执行环境的概念,执行环境这个概念是用来理解作用域的,在js中,执行环境分为全局执行环境和局部(function)执行环境,而在C#这类的C类语言中,还有一个块级别的执行环境,如if语句 ...

  7. 【repost】 原生JS执行环境与作用域深入理解

    首先,我们要知道执行环境和作用域是两个完全不同的概念. 函数的每次调用都有与之紧密相关的作用域和执行环境.从根本上来说,作用域是基于函数的,而执行环境是基于对象的(例如:全局执行环境即window对象 ...

  8. js执行环境、作用域

    js执行环境.作用域 执行环境:是javascript中的一个重要的概念,<javascript高级程序设计第三版>的定义是:执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行 ...

  9. JS中的执行环境和作用域

    window 是最大最外围的执行环境,然后每个函数都有自己的执行环境.JS代码是从上到下执行的,单纯的用语言描述可能会有点绕,而且不大直观.我们看着代码来 console.log('global be ...

  10. 浅谈JS执行环境及作用域

     今天刚刚开通博客,也是第一次写博文,略感紧张.作为一个表达能力弱弱的人来说,自己花三分钟理解一个知识点,当别人问起时,也许需要30分钟才只是让别人知道自己在说什么,一点也不夸张,希望在博客上可以练习 ...

随机推荐

  1. Linux实战教学笔记05:远程SSH连接服务与基本排错(新手扫盲篇)

    第五节 远程SSH连接服务与基本排错 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 远程连接LInux系统管理 1.1 为什么要远程连接Linux系统 在实际的工作场景中,虚拟机界面或物理 ...

  2. JavaMail发送邮件

    发送邮件包含的内容有: from字段  --用于指明发件人 to字段      --用于指明收件人 subject字段  --用于说明邮件主题 cc字段     -- 抄送,将邮件发送给收件人的同时抄 ...

  3. Mac 词典工具推荐:Youdao Alfred Workflow(可同步单词本)

    想必大家都有用过 Mac 下常见的几款词典工具: 特性 系统 Dictionary 欧路词典 Mac 版 有道词典 Mac 版 在线搜索 ✗ ✔ ✔ 屏幕取词 ☆☆☆ ★★☆ ★☆☆ 划词搜索 ★★★ ...

  4. SpringMVC的Action在同一时间里只允许同一个浏览器的单次进入?

    最近用SpringMVC写了一个很简单的测试程序,代码如下: @Controller public class LongTimeTaskController { @RequestMapping(val ...

  5. Spark笔记:复杂RDD的API的理解(下)

    本篇接着谈谈那些稍微复杂的API. 1)   flatMapValues:针对Pair RDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录 这个方法我最开始接 ...

  6. 借助亚马逊S3和RapidMiner将机器学习应用到文本挖掘

    本挖掘典型地运用了机器学习技术,例如聚类,分类,关联规则,和预测建模.这些技术揭示潜在内容中的意义和关系.文本发掘应用于诸如竞争情报,生命科学,客户呼声,媒体和出版,法律和税收,法律实施,情感分析和趋 ...

  7. LeetCode-2AddTwoNumbers(C#)

    # 题目 2. Add Two Numbers You are given two linked lists representing two non-negative numbers. The di ...

  8. 从 Everything 到 Listary,自 Launch 归 Wox

    人生即在于体验,而体验源于去尝试,去折腾,去改变,去塑新.要知道:"过一个平凡无趣的人生实在太容易了,你可以不读书,不冒险,不运动,不写作,不外出,不折腾--但是,人生最后悔的事情就是:我本 ...

  9. Git(进击学习:远程仓库操作)-V3.0

    1.查看当前的远程仓库:git remote或git remote -v 2.添加远程仓库:git remote add [shortname] [url] git remote add pb git ...

  10. javascript学习之BOM

    BOM是browser object model的缩写,简称浏览器对象模型.先看看下面这张图 window对象是BOM的顶层(核心)对象,所有对象都是通过它延伸出来的,也可以称为window的子对象. ...