首先需要明确一个执行环境的概念,执行环境这个概念是用来理解作用域的,在js中,执行环境分为全局执行环境和局部(function)执行环境,而在C#这类的C类语言中,还有一个块级别的执行环境,如if语句、for语句所形成的花括号包围起来的块。

然后就是需要理解一个关键字:var,var这个关键字在js中是用来创建一个局部变量的,使用var创建的局部变量会保存在最接近的作用域中。比如,在function中var person=new Object();就会在函数域中定义一个局部变量,这个局部变量会被放到function作用域链的前端。

执行环境:执行环境是js中最为重要的一个概念,它定义了变量或者函数有权访问的其他数据。执行环境都有一个变量对象与之进行对应,对于这一点,我的理解是因为js中没有像其他面向对象的语言可以来定义一个class,所以,在js中,执行环境对应的变量对象就是相当于在C#等语言中定义的一个class。而js中的执行环境都是固定的,比如在网页上面执行的话这个变量对象就是window(window class),在控制台上面执行的话就是console(console class)。更近一步的,在相应的执行环境中定义的属性和函数也都是作为这个执行环境的变量对象的属性和函数来进行保存的。

每个函数都有自己的执行环境(局部的),在js中存在一种这样的机制:当执行流进入一个函数中时,会将这个函数推入一个执行栈,而当函数执行完毕后会从执行栈弹出。利用这种机制来灵活的控制js的执行流。当代码在特定的环境中执行时,会创建变量对象的一个作用域链,这个作用域链的作用时保证代码的访问权限(有序访问)。作用域链的最前端始终都是当前环境的对象变量。如果这个环境是函数,那么在这个执行环境的变量对象的作用域链的最前端就是这个函数中的活动对象,活动对象最开始时只包含一个arguments。(argument是一个数组用来存放function所接受的实参。可以通过arguments[]来访问function所接受的所有实参。也可以用arguments.length来查看传入实参的个数。)作用域链上的下一个变量对象则是当前执行环境的包含环境,按照这样的排列逐渐扩大,最后到全局执行环境。

看一个例子:

var color = "blue";
function changeColor()
{
if (color === "blue")
{
color = "red";
}
else
{
color = "blue";
}
}
changeColor();
alert("color is now "+color);

 函数changeColor()的作用域链上包含两个变量对象,自身的arguments变量对象以及全局的color。可以在内部访问到color,就是因为可以在作用域链上能够找到它。 

此外,由于没有块级作用域的支持,可能会出现如下让人难以理解的例子:

var color = "blue";
function changeColor()
{
if (true)
{
var person="a";
}
alert(person);
}
changeColor();
alert("color is now "+color);

  在if条件语句中定义一个局部的变量,可以在if外面访问到!这是因为在function内部任何部位定义的变量是在function这个执行环境的变量对象的作用域链上对该变量进行了添加,所以在这个执行环境的任何地方都可以对这个变量进行访问。

JavaScript中变量、执行环境、作用域与C#中的异同的更多相关文章

  1. 【JS】JavaScript中的执行环境与作用域

    JavaScript中的执行环境定义了变量或函数有权访问的数据(每个函数都有自己的执行环境),全局执行环境是最外围的执行环境,在浏览器中,全局执行环境就是window对象,所以所有的全局变量和函数都是 ...

  2. JavaScript语言精粹--执行环境及作用域,this

    1.执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为. 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中. 虽然我们无法访问,但是解析器在处理数据时 ...

  3. Javascript高级程序设计——执行环境与作用域

    Javascript中执行环境是定义了变量或函数有权访问的其他数据,决定了各自的行为,每个执行的环境都有一个与之关联的变量对象,环境中定义的所以变量和函数都保存在这个对象中. 全局执行环境是最外围的一 ...

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

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

  5. JavaScript:理解执行环境、作用域链和活动对象

    作用域的原理,对JS将如何解析标识符做出了解答.而作用域的形成与执行环境和活动对象紧密相关. 我们对于JS标识符解析的判断,存在一个常见误区 首先,看一个关于JS标识符解析的问题 ,源于风雪之隅提出的 ...

  6. javascript基础进阶——执行环境及作用域链

    概念 执行环境 执行环境定义了变量或函数有权访问的其他函数,决定了他们各自的行为.每个执行环境都有一个与之关联的变量对象. 变量对象 环境中定义的所有变量和函数都保存在这个对象中. 全局执行环境 全局 ...

  7. Javascript 函数及其执行环境和作用域

    函数在javascript中可以说是一等公民,也是最有意思的事情,javascript函数其实也是一个对象,是Function类型的实例.因此声明一个函数首先可以使用 Function构造函数: va ...

  8. js中的执行环境和作用域链

    首先介绍一些即将用到的概念: 执行环境:  它定义了变量和函数有权访问其他数据的范围,每一个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个变量对象中.   所有javasc ...

  9. javascript学习笔记 - 执行环境及作用域

    一 执行环境(环境) 1.每个执行环境都有一个关联的全局变量对象.例如:web浏览器中,window对象为全局变量对象.环境中定义的所有变量和函数都保存在该对象中.全局执行环境是最外围的环境. 2.执 ...

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

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

随机推荐

  1. SAP S/4嵌入式分析——虚拟数据模型(VDM)

    在本文中,我会通过CDS视图来介绍虚拟数据模型(Virtual Data Model,以下简称VDM). 在SAP HANA平台出现后,SAP的业务应用开发模式已经产生了变化,新的经验法则是:尽可能在 ...

  2. 《生命》第三集:Mammals (哺乳动物)

    南极零下四十度的情况下,威德尔海豹能深潜到冰下捕食,并且教自己的小宝宝如何下水,看了这个才知道,海豹居然是哺乳动物,小海豹看着挺萌的. 长鼻鼩是一种很活跃的生物,而且会自己设计路线,建立迷宫,帮助自己 ...

  3. axios超时timeout拦截

    应用场景: 在网络请求中,可能不可避免的会遇到网络差或者请求超时的情况,这时候,如果你采用的技术是axios,那就可以通过设置拦截器捕获这个异常情况,并做出下一步处理. 代码实践: ① 设置拦截器,返 ...

  4. MySQL高级知识(九)——慢查询日志

    前言:慢查询日志是MySQL提供的一种日志记录,它记录MySQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的sql语句,该sql语句会被记录到慢查询日志中.慢查询日志 ...

  5. 【JXOI2018】守卫

    [JXOI2018]守卫 参考题解:https://blog.csdn.net/dofypxy/article/details/80196942 大致思路就是:区间DP.对于\([l,r]\)的答案, ...

  6. nginx配置文件服务器

    server{ listen  端口号; server_name   localhost; charset utf-8; root    放文件的路径; location   /xxx/yyy/ { ...

  7. mumu安卓模拟器使用教程

    安装教程: 1http://mumu.163.com/  在这网址里面下载 2.安装 我的是mac 安装时需要输入你的你电脑密码  但是也报错,你点击旁边的提示就会告诉去安全与隐私里点击允许就好了 很 ...

  8. hystrix

    <servlet> <display-name>HystrixMetricsStreamServlet</display-name> <servlet-nam ...

  9. 6.02-news_re

    import re import requests url = 'http://news.baidu.com/' headers = { "User-Agent": 'Mozill ...

  10. C++ 参数传值 与 传引用

    参数传值 在 C++ 中,函数参数的传递有两种方式:传值和传引用.在函数的形参不是引用的情况下,参数传递方式是传值的.传引用的方式要求函数的形参是引用.“传值”是指,函数的形参是实参的一个拷贝,在函数 ...