曾经看到过这样一段有意思的程序:

var a=3;
function scopeTest(){
console.log(a);
var a=2;
console.log(a);
} scopeTest();

在控制台上打印结果为:

undefined

2

对于第一次输出的undefined感觉到奇怪。

在查了一些资料后发现:

  javascript的运行其实要分为两个过程,第一个过程是词法分析,第二个过程是执行。在以上的这段程序中var a=3和var a=2这两个语句都可以分别看做是两部分;var a;是变量声明过程,a=3是变量赋值过程;这两个过程分别是在词法分析过程和执行过程执行的,由于词法分析过程的执行要先于执行过程,词法分析时将一个函数里面的所有变量声明都赋值给一个activeObject的属性如在scopeTest中:

scopeTest activeObject:{

  a:undined

}

在函数执行时,当执行到console.log(a);发现一个变量,便去scopeTest activeObject中寻找a属性,如果找不到,去该函数的上一级的activeObject中寻找,直到查找到window对象;在该程序中在scopeTest activeObject中找到了a属性,然后变返回它的值undefined;在执行到 var a=2时;给scopeTest activeObject.a赋值为2,所以console.log(a);的值为2。我们通常把函数的activeObject称为作用域,把当前函数的activeObject和其父级的activeObject形成的这种从里向外的关系称为作用域链。

在词法分析过程中还会发生一些别的动作会产生一些有意思的事情我们以后再分析

对于javascript的词法作用域的思考的更多相关文章

  1. 关于JavaScript的词法作用域及变量提升的个人理解

    关于JavaScript的作用域,最近听到一个名词:“词法作用域”:以前没有听说过(读书少),记录一下对此的理解,加深印象. 词法作用域:在JavaScript中,一个函数的作用域,在这个函数定义好的 ...

  2. JavaScript的词法作用域问题

    多年以前,当我怀揣着前端工程师的梦想时,曾经认真阅读过<JavaScript高级程序设计(第2版)>.里面有一个问题(P147),让我一直百思不得其解. function createFu ...

  3. JavaScript 使用词法作用域,没有动态作用域

    function foo() { console.log( a ); } function bar() { var a = 3; foo(); } var a = 2; bar(); 上面的代码,控制 ...

  4. javascript 欺骗词法作用域

    如果词法作用域完全由写代码期间函数所声明的位置来定义,怎样才能在运行时来"修改"(也可以说欺骗)词法作用域呢?    JavaScript 中有两种机制来实现这个目的.社区普遍认为 ...

  5. javascript的词法作用域

    这个概念是js中相当基础也是极为重要的,很多想当然的错误或感觉怪异的问题都是和这个东西有关.所以,本文主要说下这个名词的概念以及讨论下他牵扯出来的有关变量.函数.闭包的问题. 由变量开始谈 习惯性先来 ...

  6. JavaScript高级之词法作用域和作用域链

    主要内容: 分析JavaScript的词法作用域的含义 解析变量的作用域链 变量名提升时什么 一.关于块级作用域         说到JavaScript的变量作用域,与咱们平时使用的类C语言不同. ...

  7. JavaScript深入之词法作用域和动态作用域(转载)

    作用域 作用域是指程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 采用词法作用域(lexical scoping),也就是静态作 ...

  8. 网易JS面试题与Javascript词法作用域说明

    调用对象位于作用域链的前端,局部变量(在函数内部用var声明的变量).函数参数及Arguments对象都在函数内的作用域中--这意味着它们隐藏了作用域链更上层的任何同名的属性. 2010年9月14日, ...

  9. JavaScript深入之词法作用域和动态作用域

    作用域 作用域是指程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 采用词法作用域,也就是静态作用域. 静态作用域与动态作用域 因 ...

随机推荐

  1. [Express] Level 4: Body-parser -- Post

    Parser Setup Assume the body-parser middleware is installed. Now, let's use it in our Express applic ...

  2. 现有一些开源ESB总线的比較

    现有的开源ESB总线中,自从2003年第一个开源总线Mule出现后,如今已经是百花争鸣的景象了.如今我就对现有的各种开源ESB总线根据性能.可扩展性.资料文档完整程度以及整合难易程度等方面展开. 一. ...

  3. ASP.NET项目从VS2008迁移至VS2010或2012编译不过的问题

    这次将一个VS2008编写的网站迁移至VS2010或者2012下都编译不通过,统统报相同的错误:缺少System.Linq引用,缺少System.Xml.Linq引用,但是明明有引用啊,引用DLL我都 ...

  4. Linux VM子系统参数调整

    Timesten数据库下的Linux page子系统参数调整  如果Timesten(TT)采用了Durablecommits或是share memory segment被lock的话,那么linux ...

  5. 基于jquery tool实现的windows桌面效果

    今天给大家分享一款基于jquery tool实现的windows桌面效果.这款实例适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗.效果图如下: ...

  6. Linux 下五个顶级的开源命令行 Shell

    这个世界上有两种 Linux 用户:敢于冒险的和态度谨慎的. 其中一类用户总是本能的去尝试任何能够戳中其痛点的新选择.他们尝试过不计其数的窗口管理器.系统发行版和几乎所有能找到的桌面插件. 另一类用户 ...

  7. Linux下校验下载文件的完整性(MD5,SHA1,PGP)

    查看: Linux下校验下载文件的完整性(MD5,SHA1,PGP) http://blog.useasp.net/archive/2014/03/29/use-md5-sha1-or-pgp-to- ...

  8. xml<>编译

    < 用 <    >用 >      表示"空格"

  9. 观察者模式(一)--《Head First DesignPattern》

    观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖着都会受到通知并且自动更新. 我们先看下类图: 首先我们自己创建Subject接口,定义了注册观察者,移除观察者和通知 ...

  10. Java基础知识强化之IO流笔记76:NIO之 Channel(通道)之间的数据传输

    1. 在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel. (1)trans ...