JavaScript中变量、执行环境、作用域与C#中的异同
首先需要明确一个执行环境的概念,执行环境这个概念是用来理解作用域的,在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#中的异同的更多相关文章
- 【JS】JavaScript中的执行环境与作用域
JavaScript中的执行环境定义了变量或函数有权访问的数据(每个函数都有自己的执行环境),全局执行环境是最外围的执行环境,在浏览器中,全局执行环境就是window对象,所以所有的全局变量和函数都是 ...
- JavaScript语言精粹--执行环境及作用域,this
1.执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为. 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中. 虽然我们无法访问,但是解析器在处理数据时 ...
- Javascript高级程序设计——执行环境与作用域
Javascript中执行环境是定义了变量或函数有权访问的其他数据,决定了各自的行为,每个执行的环境都有一个与之关联的变量对象,环境中定义的所以变量和函数都保存在这个对象中. 全局执行环境是最外围的一 ...
- js中的执行环境及作用域
最近在面试时被问到了对作用域链的理解,感觉当时回答的不是很好,今天就来说说js中的作用域链吧. 首先来说说js中的执行环境,所谓执行环境(有时也称环境)它是JavaScript中最为重要的一个概念.执 ...
- JavaScript:理解执行环境、作用域链和活动对象
作用域的原理,对JS将如何解析标识符做出了解答.而作用域的形成与执行环境和活动对象紧密相关. 我们对于JS标识符解析的判断,存在一个常见误区 首先,看一个关于JS标识符解析的问题 ,源于风雪之隅提出的 ...
- javascript基础进阶——执行环境及作用域链
概念 执行环境 执行环境定义了变量或函数有权访问的其他函数,决定了他们各自的行为.每个执行环境都有一个与之关联的变量对象. 变量对象 环境中定义的所有变量和函数都保存在这个对象中. 全局执行环境 全局 ...
- Javascript 函数及其执行环境和作用域
函数在javascript中可以说是一等公民,也是最有意思的事情,javascript函数其实也是一个对象,是Function类型的实例.因此声明一个函数首先可以使用 Function构造函数: va ...
- js中的执行环境和作用域链
首先介绍一些即将用到的概念: 执行环境: 它定义了变量和函数有权访问其他数据的范围,每一个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个变量对象中. 所有javasc ...
- javascript学习笔记 - 执行环境及作用域
一 执行环境(环境) 1.每个执行环境都有一个关联的全局变量对象.例如:web浏览器中,window对象为全局变量对象.环境中定义的所有变量和函数都保存在该对象中.全局执行环境是最外围的环境. 2.执 ...
- JS中的执行环境和作用域
window 是最大最外围的执行环境,然后每个函数都有自己的执行环境.JS代码是从上到下执行的,单纯的用语言描述可能会有点绕,而且不大直观.我们看着代码来 console.log('global be ...
随机推荐
- 力扣算法题—060第K个排列
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "132&qu ...
- 05.Python网络爬虫之三种数据解析方式
引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...
- 比MR至少快5倍的神器,竟然是它
Hive简介 Hive是一个基于 Hadoop 的开源数据仓库工具,用于存储和处理海量结构化数据.它最初是应Facebook对每天产生的海量新兴社会网络数据进行管理和机器学习的需求而产生和发展的,Hi ...
- 【CQOI2012】局部极小值
[CQOI2012]局部极小值 Description 有一个\(n\)行\(m\)列的整数矩阵,其中\(1\)到\(nm\)之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或 ...
- SQLite 线程安全和并发
SQLite 与线程 SQLite 是线程安全的. 线程模型 SQLite 支持如下三种线程模型 单线程模型 这种模型下,所有互斥锁都被禁用,同一时间只能由一个线程访问. 多线程模型 这种模型下,一个 ...
- executequery要求已打开且可用的connection,连接的当前状态为已关闭
问题: executequery要求已打开且可用的connection,连接的当前状态为已关闭 错误原因: 连接的当前状态为已关闭.或者只创建了Connection对象,没有调用Connection. ...
- Your kernel does not support swap limit capabilities.memory limit without swap
原因是:由于内核不支持限制内存的设置 解决办法是:vim /etc/default/grub 修改为: 或者:GRUB_CMDLINE_LINUX="cgroup_enable=memory ...
- RESTful学习笔记
作为一名只有几个月IT自学经历的人,在接受新知识的时候总是想找到浅显易懂的方式去理解,但往往却很难找到相关的文章,大部分都是针对具有一定经验的开发人员,因此在看了很多相关的文章才对RESTful架构有 ...
- Nginx系列一:正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡
转自https://www.cnblogs.com/leeSmall/p/9351343.html 仅供个人学习 一.什么是正向代理.什么是反向代理 1. 正向代理,意思是一个位于客户端和原始服务器( ...
- 7-EL表达式和JSTL表达式
引入jar包 一.EL表达式1.表达式语言,用于jsp网页中获取和计算数据2.语法:${表达式}3.用于取值:可以从pageContext,request,session,application这些域 ...