首先,为什么某些函数以及变量在没有被声明以前就可以被使用,javascript引擎内部在执行代码以前到底做了些什么?这里,想信大家都会想到,变量声明提前这个概念;

但是,以下我要讲的是,声明提前的这个原理;

首先,“执行上下文”,不要和作用域混淆了,这不是同一个概念。

js代码运行的环境分为以下几个:

  • 全局级别的代码 - 这个是默认的代码运行环境,一旦代码被载入,引擎最先进入的就是这个环境==>全局上下文

  • 函数级别的代码 - 当执行一个函数时,运行函数体中的代码。==>函数上下文

  • Eval的代码 - 在Eval函数内运行的代码。

每个运行环境下的代码都会产生一个执行上下文,此时的执行上下文则包含了,变量,函数声明,函数参数;

接着,我要说下另一个家伙,VO(variable object),他叫做变量对象,用于存储执行上下文中的变量、函数参数、函数声明,因此结合上一句话,执行上下文的具体表现形式就是VO,变量对象;

接下来看下一个例子:

function test(a,b){
  var c=10;
function d(){};
var e = function() _e(){};
(function x(){});
b=20;
} test(10);

分析以上这段代码,我们举这个例子来讲讲函数的执行上下文。函数执行上下文会分为2个阶段:初始化阶段,执行阶段

1、初始化阶段

这里vo对象初始化有一个顺序规则:函数参数传入->函数声明-->变量声明;

好,首先函数参数传入,会保存到VO里面,这里a 传入为10,而b未传入,为undefined,因此vo里面的a:10,b:undefined;

接着,函数声明,也会被保存到vo里面,(这里就是函数声明提前的原因,在代码还没被执行的时候,执行上下文vo里面已经存在该函数了),但是,这里有个注意点,就是如果函数名和上一步的函数参数传入同名,则该函数会覆盖上一步传入的参数;因此这里d:<ref to func 'd'>

最后,变量声明,一样也会被保存至vo,var c = 10;这里,c = 10是赋值操作。我们这个时候是处于vo初始化阶段,因此,这个时候,vo只保存c : undefined,e:undefined;(这里的注意点是,如果函数名和上一步函数声明的函数名重名,则该变量被忽略);

到这里,变量初始化阶段结束,这时候的执行上下文的vo对象如下:

VO(test) = {

  a:10,

  b:undefined,

  d:<ref to func 'd'>,

c:undefined,

  e:undefined

}

2、执行阶段(此阶段变量对象称为AO)

这个阶段就非常简单了,这个阶段则是对上一个阶段初始化完成的vo对象里面的属性进行赋值,结果如下:

AO(test) = {

  a:10,

  b:20,

  d:<ref to func 'd'>,

c:10,

  e:function _e(){}

}

为了更好的解释这个过程,再来一个例子:

function foo(x,y,z){
function x(){};
var x;
console.log(x);
};
foo(100);

首先,函数执行上下文vo对象初始化阶段:

foo()函数传入参数为100,x-->100;

函数声明 function x(){},故函数名与foo函数入参一致,采用覆盖,则 x--><ref to func 'x'>

变量x声明,由于和function x (){}同名,故采用忽略;

此时:

vo(foo)={

x:<ref to func 'x'>

} ;

执行阶段也没有变;故打印出来的x是function (){}

若将以上代码稍作修改:

function foo(x,y,z){
function x(){};
var x=1;
console.log(x);
};
foo(100);

此情况下的初始化阶段和上面例子是完全一致的;

唯一不同的是,在执行阶段,,x 被赋值为1,故:

AO(foo)={

x:1

} ;

打印出来的值是,1;

总结,这部分的内容比较难以理解;但是这个内容可以对变量和函数声明提前这个知识点理解有所帮助;

即其原理即是在执行上下文的初始阶段,变量和函数都被初始化存入vo对象,执行阶段的时候,解析器可以在vo对象中找得到对应的变量或者函数;

javascript 执行上下文的理解的更多相关文章

  1. 对于Javascript 执行上下文的理解

    转载无源头地址 在这篇文章中,将比较深入地阐述下执行上下文 – JavaScript中最基础也是最重要的一个概念.相信读完这篇文章后,你就会明白javascript引擎内部在执行代码以前到底做了些什么 ...

  2. 深入理解javascript执行上下文(Execution Context)

    本文转自:http://blogread.cn/it/article/6178 在这篇文章中,将比较深入地阐述下执行上下文 - Javascript中最基础也是最重要的一个概念.相信读完这篇文章后,你 ...

  3. 深入理解JavaScript执行上下文、函数堆栈、提升的概念

    本文内容主要转载自以下两位作者的文章,如有侵权请联系我删除: https://feclub.cn/post/content/ec_ecs_hosting http://blog.csdn.net/hi ...

  4. Javascript 执行上下文 context&scope

    执行上下文(Execution context) 执行上下文可以认为是 代码的执行环境. 1 当代码被载入的时候,js解释器 创建一个 全局的执行上下文. 2 当执行函数时,会创建一个 函数的执行上下 ...

  5. 《浏览器工作原理与实践》<11>this:从JavaScript执行上下文的视角讲清楚this

    在上篇文章中,我们讲了词法作用域.作用域链以及闭包,接下来我们分析一下这段代码: var bar = { myName:"time.geekbang.com", printName ...

  6. JavaScript执行上下文

    变量声明.函数声明为何会提升?js执行时是如何查找变量的?JavaScript中最基本的部分——执行上下文(execution context) 什么是执行上下文? 当JavaScript代码运行,执 ...

  7. javascript --执行上下文,作用域

    执行上下文 顾名思意就知道他是动态的,只在代码运行的时候产生 作用域 顾名思意就知道它是一个"领域",并且这个"领域"在一开始就规划好, 不会在改, var d ...

  8. 再看javascript执行上下文、变量对象

    突然看到一篇远在2010年的老文,作者以章节的形式向我们介绍了ECMA-262-3的部分内容,主要涉及到执行上下文.变量对象.作用域.this等语言细节.内容短小而精悍,文风直白而严谨,读完有酣畅淋漓 ...

  9. javascript执行上下文学习一

    原文: http://web.jobbole.com/84044/ http://blog.csdn.net/github_34514750/article/details/52901781 1.三种 ...

随机推荐

  1. Web前端之jQuery 的10大操作技巧

    不管是做什么事情,人们习惯在工作中去找方法.找技巧,来帮助提高效率,在软件开发中更是如此.jQuery作为前端开发必学技术之一,在使用中也有各种各样的小技巧,今天小编为大家分享10条必知会的技巧,希望 ...

  2. libc++abi.dylib`__cxa_throw: 视频播放时异常

    这两天研究视频播放,集成RTMP视频出现的异常,刚好看到一篇博客,楼主使用[AVAudioPlayer Play]时出现了异常...记录下来: 由于xcode中设置了当所有异常出现时的断点,,解决办法 ...

  3. Thread比Task多出的无法代替的部分

    Task比Thread耗资源更少,且默认在线程池中. 但是Thread能够设置为STA来执行而Task不能,这对于某些特殊功能很重要,比如WebBrowser控件对象就不能在非单线程单元的线程中new ...

  4. NGUI之UIRoot——屏幕的自适应分辨率的计算

    //原来写在其他博客上的东西,搬迁 预备知识: 要明确的三个概念: 设计分辨率:在编辑器上开发UI使用的分辨率.我们所有的UI都是在这个分辨率下设计制作的. 显示区域分辨率:设备上所显示的UI区域在编 ...

  5. sublime如何自动保存

    sublime是前端开发者喜欢使用的工具,它有很多快捷方式可以让我们快速的编写代码:在开发过程中,每次修改代码之后都要按Ctrl+S保存.在这里向大家介绍一下如何设置让它自动保存. 一.打开subli ...

  6. java.io.EOFException

    错误代码如下: 严重: IOException while loading persisted sessions: java.io.EOFException java.io.EOFException ...

  7. json的注意事项

    原文摘自:http://www.cnblogs.com/xcxc/p/3729207.html 在PHP语言中使用JSON和将json还原成数组   PHP原生提供json_encode()和json ...

  8. JavaScript通过id获取不到元素是什么原因阿?

    s代码 JavaScript code   ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function show_more_mess() {     $(&qu ...

  9. SQL Server 事务以及事务日志综述

    事务是一个非常重要的概念,特此在这里写一些文章来总结.整篇文章还在持续更新中. 在本系列文章中,你将看到以下内容: 数据库事务(Database Transaction)概述 事务操作(BEGIN/C ...

  10. 简单爬虫,突破IP访问限制和复杂验证码,小总结

    简单爬虫,突破复杂验证码和IP访问限制 文章地址:http://www.cnblogs.com/likeli/p/4730709.html   好吧,看题目就知道我是要写一个爬虫,这个爬虫的目标网站有 ...