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执行环境,作用域链及非块状作用域的更多相关文章

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

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

  2. js执行环境、作用域

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

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

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

  4. JavaScript 执行环境(执行上下文) 变量对象 作用域链 上下文 块级作用域 私有变量和特权方法

    总结自<高程三>第四章  理解Javascript_12_执行模型浅析   JS的执行环境与作用域  javascript高级程序第三版学习笔记[执行环境.作用域] 在javascript ...

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

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

  6. js执行环境相关

    Js执行过程 如果一个文档中存在多个代码段 步骤一:读入第一个代码段(js引擎并非一行一行执行,而是一段一段分析执行) 步骤二:做词法分析和语法分析,有错则报语法错误(比如括号不匹配等),并跳转到步骤 ...

  7. js执行环境的深入理解

    第一个例子中 :之所以每个函数都返回不同的值的原因 有2点 (简写如下文) 就是[SCOPE]内部属性,函数可能拥有相同的父作用域时,多个函数引用同一个[SCOPE]属性,所以return i的值还是 ...

  8. js执行环境深入研究

    js 声明函数是创建函数对象的过程,当创建函数对象时,函数对象的[[scope]] =连当前执行环境对象的作用域(栈顶执行环境--当执行函数时,js会将该函数的执行环境对象入栈) 当为全局函数时,如: ...

  9. js执行环境的周边概念

    一.熟悉几个名词: 1.执行环境(execution context),也叫执行上下文,每个函数都会有自己的执行环境:当浏览器首次加载脚本时,他将默认进入全局执行环境:如果接下来要调用一个内部函数,则 ...

随机推荐

  1. Xcode 10.1 运行老版本工程遇到问题解决记录

    近来接手公司一个历史遗留项目进行修改.上线工作,想想我都近三年没敲过iOS代码了也是慌.. 项目大致情况: 18年年初应上线项目,各种情况下一直搁置,到18年底了要重启上线,原来开发人员离职了都,年底 ...

  2. 手机QQ公众号亿级消息实时群发架构

    编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由孙子荀分享.转载请注明来自高可用架构公众号 ArchNotes.   孙子荀,2009 年在华为从事内核和分布式系统的开发工作:2011 ...

  3. 执行JS

    JS执行切换frame框架后点击 Window.frame['frame路径'].frame['下级frame路径'].document.getElementById("id"). ...

  4. 通过excel获取一串连续的数字

    输入一个格式的数字 点击按住右下角 拖动即可

  5. 什么是布局?Android中的布局是怎样的?

    布局管理器(通常被称为是布局)是对ViewGroup类的扩展,是用来控制子控件在UI中的位置. Android SDK包含了许多布局类,在为视图.Fragment和Activity创建UI时,可以使用 ...

  6. spring创建bean的三种方式

    spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...

  7. S7 Connection 通讯

    参考两个链接: http://www.ad.siemens.com.cn/service/answer/solution.aspx?Q_ID=74626&cid=1029 https://su ...

  8. CentOS 7.3/Linux .net core sdk 安装

    执行下列命令,安装.NET Core SDK(微软官方教程地址 https://www.microsoft.com/net/learn/get-started/linuxcentos) 点开链接,选择 ...

  9. Flask的上下文源码剖析

    先写一段Flask程序 from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return ...

  10. jieba库的使用与词频统计

    1.词频统计 (1)词频分析是对文章中重要词汇出现的次数进行统计与分析,是文本 挖掘的重要手段.它是文献计量学中传统的和具有代表性的一种内容分析方法,基本原理是通过词出现频次多少的变化,来确定热点及其 ...