上下文环境

##执行上下文环境
在一段JS真正运行之前浏览器已经做了一些准备工作:
    1.变量:变量的申明,默认值为undefined;
    2.this:赋值;
    3.函数申明:赋值
变量:
console.log(a)  ---> a is not undefined

console.log(a)-----> undefined    
var a

console.log(a)-----> undefined    
var a = 10

this:
console.log(this)  --->window{top:window,window:wina}

函数声明:

console.log(f1);  //functionf1(){}
function f1(){}    //函数申明

console.log(f2);   //undefined
var f2 = function (){}    //函数表达式

##函数中的变量

如果函数中出了以上数据外还有其他数据:
function fn(x){
    console.log(arguments);                 [10]
    console.log(x);              //----->    10
}
fn(10);

函数每被调用一次,都会产生一个新的执行上下文环境,因为不同的调用可能就会有不同的参数.
函数在定义的时候就确定了函数内部变量的作用域.

##执行上下文栈
执行全局代码时会产生一个全局上下文环境,每次调用函数时又会产生一个函数上下文环境,当函数调用完成时,这个函数上下文环境以及其中的数据都会被销毁,在重新回到全局上下文环境处于活动状态的执行上下文环境只有一个.实际上,就是一个压栈和出栈的过程.

var a = 10  //1.进入全局上下文环境
var fn = function(y){
    var c = 5;
    consolde.log(y + c);
};
var bar = function(x){
    var b = 5;
    fn(x + b);   //3.进入函数上下文环境
};
bar ();    //2.进入bar函数上下文环境

##作用域和执行上下文

作用域只是一个“地盘”,一个抽象的概念,其中没有变量,要通过作用域对应的执行上下文环境来获取变量的值,在同一作用域下,不同的调用会产生不同的执行上下文环境,继而产生不同变量的值.

##自由变量
在A作用域中使用的变量x,却没有在A作用域中声明(在其他作用域中声明),对于A作用域来说x是一个自由变量.
var x = 10;
function(){
    console.log(x);  //x是自由变量
}

##作用域链
1.先在当前作用域中查找x,如果有则获取并结束,如果没有则继续;
2.如果当前作用域是全局作用域,则证明x未定义,结束,否则继续;
3.(不是全局作用域,就是函数作用域)将创建该函数的作用域作为当前作用域;
4.跳转到第一步.

时间: 2024-10-27 18:10:38

上下文环境的相关文章

javascript执行上下文环境

今天,想对javascript的执行上下文环境做一个深入的理解.之前一直都有这打算的,但无奈忙着忙着就忘记了.今天看了一篇博客,对执行上下文环境的理解可以说是醍醐灌顶. 一.对一段代码的理解开始 在浏览器的控制台输入以下代码段: 这个结果说明,代码在一句句执行之前,浏览器已经做了一些准备工作,所以,后面两个都没有报错.下面再看一段代码: 这个结果说明,函数声明时,把整个函数赋值了,而函数表达式和变量一样,只是申明. 我们总结一下,在"准备工作"中完成了哪些工作: 变量.函数表达式--变

深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】

上文简单介绍了作用域,本文把作用域和上下文环境结合起来说一下,会理解的更深一些. 如上图,我们在上文中已经介绍了,除了全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了.而不是在函数调用时确定. 下面我们将按照程序执行的顺序,一步一步把各个上下文环境加上.另外,对上下文环境不了解的朋友,可以去看看之前的两篇文章: http://www.cnblogs.com/wangfupeng1988/p/3986420.html http://www.cnblogs.com/wan

深入理解javascript原型和闭包(17)——补充:上下文环境和作用域的关系

摘自:http://www.cnblogs.com/wangfupeng1988/p/4000798.html:作者:王福朋: 本系列用了大量的篇幅讲解了上下文环境和作用域,有些人反映这两个是一回儿事.本文就用一个小例子来说明一下,作用域和上下文环境绝对不是一回事儿. 再说明之前,咱们先用简单的语言来概括一下这两个的区别. 00 上下文环境: 可以理解为一个看不见摸不着的对象(有若干个属性),虽然看不见摸不着,但确实实实在在存在的,因为所有的变量都在里面存储着,要不然咱们定义的变量在哪里存? 另

深入理解javascript原型和闭包(18)——补充:上下文环境和作用域的关系

本系列用了大量的篇幅讲解了上下文环境和作用域,有些人反映这两个是一回儿事.本文就用一个小例子来说明一下,作用域和上下文环境绝对不是一回事儿. 再说明之前,咱们先用简单的语言来概括一下这两个的区别. 00 上下文环境: 可以理解为一个看不见摸不着的对象(有若干个属性),虽然看不见摸不着,但确实实实在在存在的,因为所有的变量都在里面存储着,要不然咱们定义的变量在哪里存? 另外,对于函数来说,上下文环境是在调用时创建的,这个很好理解.拿参数做例子,你不调用函数,我哪儿知道你要给我传什么参数? 01 作

执行上下文环境—JavaScript面向对象高级

#  执行上下文环境 # **定义**:执行函数的时候,会产生一个上下文的对象,里面保存变量,函数声明和this. **作用**:用来保存本次运行时所需要的数据 在产生执行上下文(执行上下文环境)时,浏览器会做以下三个准备工作: 1.提取var 声明的变量,并赋值为 undefined 2.提取声明式函数. 3.给this赋值,指向window或当前对象. 函数每执行一次都会产生一个执行上下文, 因为函数参数不同会有不同的计算结果, ## 全局上下文环境 ## 全局级别的代码,如多个script

JavaScript作用域、上下文环境、函数对象的定义与调用、匿名函数的定义与调用、闭包

提到闭包总给人很高深的感觉,网上的例子也数不胜数.但是我发现相当一部分并不容易理解.根据我的观察,是因为这些例子把标题中提到的概念糅杂在了一起,往往越看越糊涂.所以我希望化整为零,拆成简单例子来解释. 1.先看作用域: JavaScript作用域只有两种--全局作用域和函数内作用域,没有代码块作用域.示例: function loop(){ for(var i=0;i<5;i++){ //doSomething; } alert(i); } loop(); //执行函数结果为5. 尽管变量i已经

执行上下文环境

学习文章------①王福明的博客   ②汤姆大叔的博客 总结笔记 知识点: 1.执行上下文环境,简单地说就是在执行代码之前把所有变量拿出来赋值. 2.处于执行上下文栈最上面的为活动状态 全局上下文环境 准备工作 ①变量的声明(普通变量,函数表达式) ②函数声明 ③this的指向(例如:console.log(this)) 函数体上下文环境 重点:Ⅰ.函数是在定义的时候确定了自由变量的作用域,而不是在调用的时候 Ⅱ.函数每调用一次,就会产生一个上下文环境        Ⅲ.函数执行完之后,上下文

Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8201936 在前文中,我们简要介绍了Android应用程序窗口的框架.Android应用程序窗口在运行的过程中,需要访问一些特定的资源或者类.这些特定的资源或者类构成了Android应用程序的运行上下文环境,Android应用程序窗口可以通过一个Context接口来访问它,这个Context接口也是我们在开发应用程序时经常碰到的.在本文中,我们

通过ApplicationContextAware加载Spring上下文环境

通过ApplicationContextAware加载Spring上下文环境 原创 2013年09月05日 18:15:44 标签: Spring / ApplicationContextAw 项目用到了ApplicationContextAware,通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware接口中的setApplicationContext方法. 我们在ApplicationContextAware的实现类中,就可以通过这个上下文环境对象得到