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

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声明,所以在函数外仍能访问到)

  

时间: 2024-10-20 03:59:17

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

JavaScript 中的执行环境、作用域(scope)以及变量提升(hoisting)

先看下面一段代码: var a = 0; alert("1st alert : a = " + a); function fun(){ alert("2nd alert : a = " + a); var a = 1; setTimeout(function(){ alert("3rd alert : a = " + a); a = 2; },1000); a = 3; setTimeout(function(){ alert("4th

Javascript中的执行环境及作用域

执行环境(exectution context)定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中.虽然我们编写的代码无法访问这个对象,但解析器在处理数据时会在后台使用它. 全局执行环境是最外围的一个执行环境.在web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的.某个执行环境中的所有代码执行完毕后,该环境

js中的执行环境及作用域

最近在面试时被问到了对作用域链的理解,感觉当时回答的不是很好,今天就来说说js中的作用域链吧. 首先来说说js中的执行环境,所谓执行环境(有时也称环境)它是JavaScript中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据 ,决定了它们各自的行为.而每个执行环境都有一个与之相关的变量对象,环境中定义的所有变量和函数都保存在这个对象中. 理解了执行环境,现在就看看什么是作用域链吧.每个函数都有自己的执行环境,当代码在执行环境中执行时,就会创建变量对象的作用域链.作用域链保证了对执

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

函数在javascript中可以说是一等公民,也是最有意思的事情,javascript函数其实也是一个对象,是Function类型的实例.因此声明一个函数首先可以使用 Function构造函数: var saySomething = new Function("something","console.log(something)"); saySomething("hello world!"); // 输出hello world! Function

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

Javascript中执行环境是定义了变量或函数有权访问的其他数据,决定了各自的行为,每个执行的环境都有一个与之关联的变量对象,环境中定义的所以变量和函数都保存在这个对象中. 全局执行环境是最外围的一个执行环境.全局执行环境被认为是window对象,所有全局变量和函数都作为window对象的属性和方法创建的.某个执行环境中的所有代码执行完后,该环境被销毁,保存在其中的所有变量和函数定义也随之销. 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,而在函数执行完

深入理解javascript中执行环境(作用域)与作用域链

相信很多初学者对与javascript中的执行环境与作用域链不能很好的理解,这里,我会按照自己的理解同大家一起分享. 一般情况下,我们把执行环境分为全局执行环境和局部执行环境,其中局部执行环境我们又可以称之为函数执行环境.那么究竟什么使执行环境呢?通俗的说,执行环境即为代码执行时所处的环境.我们下来看一看如下代码,再进一步分析之. 1 2 3 4 5 6 7 8 9 10 11 <script><br>var name="zhuzhenwei"; functio

执行环境,作用域

在javascript的学习中,执行环境.作用域是2个非常非常重要和基本的概念,理解了这2个概念对于javsacript中很多脚本的运行结果就能明白其中的道理了,比如搞清作用域和执行环境对于闭包的理解至关重要. 一.执行环境(exection context,也有称之为执行上下文) 所有 JavaScript 代码都是在一个执行环境中被执行的.执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域.生存期等方面的处理,它定义了变量或函数是否有权访问其他数据,决定各自行为. 在j

VO、AO、执行环境和作用域链

1.变量对象(variable object) 原文:Every execution context has associated with it a variable object. Variables and functions declared in the source text are added as properties of the variable object. For function code, parameters are added as properties of

执行环境与作用域

在JavaScript中,执行环境定义了变量和函数有权范文的其他数据,决定了它们各自的行为:作用域就是变量和函数可以被访问的范围,分为全局作用域和局部作用域:如: <script> var a = 1; window.onload = function(){ var b = 2; function sum(){ var c = 3; return a+b+c; } sum(); }; </script> 以上代码,全局作用域定义了变量a并为window绑定了一个load事件的处理函