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 ...
随机推荐
- 两段锁协议(Two-Phase Locking――2PL)
两段锁协议(Two-Phase Locking――2PL) 两段锁协议规定所有的事务应遵守的规则: ① 在对任何数据进行读.写操作之前,首先要申请并获得对该数据的封锁. ② 在释放一个封锁之后,事务不 ...
- Ubuntu下软件安装的几种方式,apt,dpkg工具的使用
通常 Linux 上的软件安装主要有四种方式: 在线安装 从磁盘安装deb软件包 从二进制软件包安装 从源代码编译安装 这几种安装方式各有优劣,而大多数软件包会采用多种方式发布软件,所以我们常常需要全 ...
- Zookeeper系列一:Zookeeper介绍、Zookeeper安装配置、ZK Shell的使用
https://www.cnblogs.com/leeSmall/p/9563547.html 一.Zookeeper介绍 1. 介绍Zookeeper之前先来介绍一下分布式 1.1 分布式主要是下面 ...
- Python:Day18 os模块、logging模块、正则表达式
迭代器 满足迭代器协议: 1.内部有next方法 2.内部有iter()方法 os模块 import os print(os.getcwd()) #C:\Users\Lowry\PycharmProj ...
- Java IO(五)——字符流进阶及BufferedWriter、BufferedReader
一.字符流和字节流的区别 拿一下上一篇文章的例子: package com.demo.io; import java.io.File; import java.io.FileReader; impor ...
- Numpy求均值、中位数、众数的方法
首先需要数据源,这里随便写了一个: nums = [1,2,3,4] 求均值和中位数均可以使用numpy库的方法: import numpy as np #均值 np.mean(nums) #中位数 ...
- [C# ASP.NET]如何让IIS Express支持外部(局域网)连接
声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 一.搭建环境: 1.系统:Win10 1809 2.IDE:Visual Studio 2017 3.Framework: 4.6.1 ...
- Java 小记 - 时间的处理与探究
前言 时间的处理与日期的格式转换几乎是所有应用的基础职能之一,几乎所有的语言都会为其提供基础类库.作为曾经 .NET 的重度使用者,赖其优雅的语法,特别是可扩展方法这个神级特性的存在,我几乎没有特意关 ...
- CSS 定位 (Positioning) 实例
CSS 定位和浮动CSS 为定位和浮动提供了一些属性,利用这些属性,可以建立列式布局,将布局的一部分与另一部分重叠,还可以完成多年来通常需要使用多个表格才能完成的任务. 定位的基本思想很简单,它允许你 ...
- PySpider框架的基本用法
pyspider安装: 3.7之后无法正常使用,使用可以下载Python3.6或以下,或者修改pyspider内部代码 ———————————————————————————————————————— ...