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. C++函数返回值为类对象但未调用复制构造函数

    参考资料:https://blog.csdn.net/sxhelijian/article/details/50977946 不要迷信书本,要学会自己调试程序.

  2. PC端问题列表及解决方案

    一.CSS相关 1.PC站百度文件引用不到,出现报错,问题可能是电脑拦截了百度广告. 解决方案:把拦截广告的浏览器插件关掉. 2.ie6双倍边距:在使用了float的情况下,不管是向左还是向右都会出现 ...

  3. C++入门笔记(二)变量和基本类型

    变量和基本类型 一.基本内置类型 1.除去布尔类型和扩展的字符型外,其他整型可以分为带符号的和无符号的. 2.与其他整型不同,字符型被分为了三种:char.signed char 和 unsigned ...

  4. Java当中的线程

    1.进程和线程 进程和线程之间是什么关系 多进程:在操作系统中能(同时)运行多个任务(程序) 多线程:在同一应用程序中有多个顺序流(同时)执行 线程的执行过程 2.定义线程的方法 方法1: 定义一个线 ...

  5. ARouter基础使用(一)

    一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由.通信.解耦1.新建一个Android项目 "ARouterDemo"2.添加依赖和配置 andr ...

  6. 32 ArcToolBox学习系列之数据管理工具箱——属性域(Domains)的两种创建及使用方式

    属性域分为两类,一种是范围域,一种是编码的值,下面将两个一起介绍,其中涉及到的编码,名称,只是试验,并非真实情况. 一.首先新建一个文件型地理数据库,将数据导入或者是新建要素类都可以 二.打开ArcT ...

  7. Android找回密码功能 手机找回、邮箱找回

    找回密码功能设计:https://blog.csdn.net/qq_33472765/article/details/82287404?utm_source=blogxgwz0 手机找回:https: ...

  8. 《JavaScript DOM编程艺术》学习笔记(二)

    终于开始接着写我的读书笔记了. 17.DOM有insertBefore方法,但并没有提供insertAfter()方法.不过可利用已有的DOM方法和属性编写此函数: function insertAf ...

  9. [Swift]LeetCode241. 为运算表达式设计优先级 | Different Ways to Add Parentheses

    Given a string of numbers and operators, return all possible results from computing all the differen ...

  10. [Swift]LeetCode389. 找不同 | Find the Difference

    Given two strings s and t which consist of only lowercase letters. String t is generated by random s ...