JavaScript中的执行环境定义了变量或函数有权访问的数据(每个函数都有自己的执行环境),全局执行环境是最外围的执行环境,在浏览器中,全局执行环境就是window对象,所以所有的全局变量和函数都是作为window对象的属性和方法创建的。当某一个执行环境中所有代码执行完成后,该环境就被销毁,保存在其中的变量和函数也将被销毁,全局执行环境在关闭网页或浏览器时才被销毁。

当代码在一个环境中执行时,会创建变量对象的一个作用域链(保证对执行环境有权访问的变量和函数的有序访问),如果环境是函数,将其活动对象作为变量对象,活动对象最开始包含的变量只有一个,即arguments对象,arguments对象在全局环境中是不存在的,作用域链中的下一个变量对象来自包含环境(或者称外部环境,即包含原执行环境的执行环境),再下一个变量对象则来自再下一个包含环境,一直延续到全局执行环境。

var a = 1;
function show(){
alert(a);
} show();

  在这个例子中,函数show()的作用域链包含两个对象:一是它自己的变量对象,其中定义着arguments对象、二是全局环境中的变量对象。之所以能在函数内访问到变量a,就是因为可以在作用域链中找到它。这里其实是有两步的搜索过程,首先搜索show()的变量对象,查找其中是否包含一个名为a的标识符;在没找到的情况下,搜索下一个变量对象(全局环境的变量对象),在那找到了名为a的标识符,因为找到了这个变量的变量对象,搜索也就结束了,过程如下图:

在JavaScript中没有块级作用域,如下:

for(var i=0; i<5; i++){
do(i);
}
alert(i); // 5

  

如果是在Java、C语言中,上面的i会在for语句执行完后就被销毁,但在JavaScript中,for语句中的变量声明会将变量添加到当前的执行环境(if语句也是),这里就是全局环境,所以即使是for循环执行完了,变量i也会存在循环外部的执行环境中。

在JavaScript中,使用var声明的变量会被添加到最接近的执行环境中,如果是在函数内声明的变量,最接近的环境就是函数的局部环境;如果初始化变量时没有使用var声明,该变量会被自动添加到全局环境中。如:

function add(n1, n2){
sum = n1 + n2;
return sum;
}
var res = add(1, 2);
alert(sum); // 3(因为sum没使用var声明,所以在函数外仍能访问到)

  

【JS】JavaScript中的执行环境与作用域的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. sql server停止和重启命令

    http://www.ynpxrz.com/n822732c2024.aspx 我们知道:sql server重启分分两步走 1.停止 net stop mssqlserver 2.重启 net st ...

  2. Flex 开发框架汇总

    1.现有成熟Flex框架   Cairngorm (Adobe Open Source) - MVC framework   PureMVC (Open Source) - MVC framework ...

  3. easyUI tootip组件使用

    easyUI tootip组件使用: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  4. 迈向新纪元编辑器Atom

    第一次听说Atom是半年前天猫的学姐说她在用这款这款编辑器,期间我从dw到st再到webstorm都分别做了项目~,但是作为一名拥抱开源的FE,怎么能拒绝github社区维护的项目呢?接着就让我们感受 ...

  5. EntityFramework 简单入个门

    任何一个和数据相关的系统里,数据持久化都是一个不容忽视的问题. 一直以来,Java 平台出了很多 NB 的 ORM 框架,Hibernate.MyBatis等等..NET 平台上,ORM 框架这一块一 ...

  6. Kafka 0.10 KafkaConsumer流程简述

    ConsumerConfig.scala 储存Consumer的配置 按照我的理解,0.10的Kafka没有专门的SimpleConsumer,仍然是沿用0.8版本的. 1.从poll开始 消费的规则 ...

  7. 使用net Manager工具远程连接oracle

    一,在服务端配置oracle端口 在命令行中输入netca命令,打开相关配置默认端口号为1521 二,配置端口后使用Telnet工具调试端口是否联通 在命令行输入telnet 服务器ip 端口号 三, ...

  8. Oracle VS DB2 数据类型

    =========================Oracle VS DB2==================================== 本文转自:http://www.bitscn.co ...

  9. RESTful_简介

    一.概括总结一下什么是RESTful架构: (1)每一个URI代表一种资源: (2)客户端和服务器之间,传递这种资源的某种表现层(Representation): (3)客户端通过四个HTTP动词,对 ...

  10. Mac和Linux系统的:Arp欺骗源码

    linux系统, 简化版的ARP欺骗工具 精简版, 没有很多代码, 只要把准备好的数据, 发送给到网卡接口, 利用这个工具, 可以让局域网内的一台计算机暂时掉线: #include <stdio ...