对于javascript的词法作用域的思考
曾经看到过这样一段有意思的程序:
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的词法作用域的思考的更多相关文章
- 关于JavaScript的词法作用域及变量提升的个人理解
关于JavaScript的作用域,最近听到一个名词:“词法作用域”:以前没有听说过(读书少),记录一下对此的理解,加深印象. 词法作用域:在JavaScript中,一个函数的作用域,在这个函数定义好的 ...
- JavaScript的词法作用域问题
多年以前,当我怀揣着前端工程师的梦想时,曾经认真阅读过<JavaScript高级程序设计(第2版)>.里面有一个问题(P147),让我一直百思不得其解. function createFu ...
- JavaScript 使用词法作用域,没有动态作用域
function foo() { console.log( a ); } function bar() { var a = 3; foo(); } var a = 2; bar(); 上面的代码,控制 ...
- javascript 欺骗词法作用域
如果词法作用域完全由写代码期间函数所声明的位置来定义,怎样才能在运行时来"修改"(也可以说欺骗)词法作用域呢? JavaScript 中有两种机制来实现这个目的.社区普遍认为 ...
- javascript的词法作用域
这个概念是js中相当基础也是极为重要的,很多想当然的错误或感觉怪异的问题都是和这个东西有关.所以,本文主要说下这个名词的概念以及讨论下他牵扯出来的有关变量.函数.闭包的问题. 由变量开始谈 习惯性先来 ...
- JavaScript高级之词法作用域和作用域链
主要内容: 分析JavaScript的词法作用域的含义 解析变量的作用域链 变量名提升时什么 一.关于块级作用域 说到JavaScript的变量作用域,与咱们平时使用的类C语言不同. ...
- JavaScript深入之词法作用域和动态作用域(转载)
作用域 作用域是指程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 采用词法作用域(lexical scoping),也就是静态作 ...
- 网易JS面试题与Javascript词法作用域说明
调用对象位于作用域链的前端,局部变量(在函数内部用var声明的变量).函数参数及Arguments对象都在函数内的作用域中--这意味着它们隐藏了作用域链更上层的任何同名的属性. 2010年9月14日, ...
- JavaScript深入之词法作用域和动态作用域
作用域 作用域是指程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 采用词法作用域,也就是静态作用域. 静态作用域与动态作用域 因 ...
随机推荐
- 使用iOS手势UIGestureRecognizer
UIKit中包含了UIGestureRecognizer类,用于检测发生在设备中的手势.UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,它有下面一些子类用于处理具体的手势 ...
- [Angular 2] Generate Angular 2 Components Programmatically with entryComponents & ViewContainerRef
You can generate Angular 2 components using a combination of ViewContainer and ComponentFactory, but ...
- oc-25-id类型,
/** id:万能指针 能够指向任何OC对象. id = NSObject *, id cat = [Cat new]; [cat jump]; NSObject:是所有类的父类,基类.可以指向任何O ...
- mongodb目录
1. mongodb 数据库操作--备份 还原 导出 导入 2. ubuntu下mongodb启动脚本 3. mongodb实现远程连接 4. 用java在客户端读取mongodb中的数据并发送至服务 ...
- java使用jsp servlet来防止csrf 攻击的实现方法
背景: 1.csrf知识 CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或 ...
- 对Kernel panic-not syncing:No init found...init=option to kernel错误总结!
转载:http://blog.csdn.net/wavemcu/article/details/6950053 在移植Linux中很容易出现这样那样的问题,我也遇到过,现在就共享下人家的一些经验和自己 ...
- html 文件上传框 input标签
文件上传框 有时候,需要用户上传自己的文件,文件上传框看上去和其它 文本域差不多,只是它还包含了一个浏览按钮.访问者可以通 过输入需要上传的文件的路径或者点击浏览按钮选择需要上传 的文件. 代码格式: ...
- TextRank算法提取关键词的Java实现
转载:码农场 » TextRank算法提取关键词的Java实现 谈起自动摘要算法,常见的并且最易实现的当属TF-IDF,但是感觉TF-IDF效果一般,不如TextRank好. TextRank是在 G ...
- mysql模糊查询 like/REGEXP
原文:mysql模糊查询like/REGEXP 增删改查是mysql最基本的功能,而其中查是最频繁的操作,模糊查找是查询中非常常见的操作,于是模糊查找成了必修课. like模式 like意思是长得像, ...
- iOS - UI - UISlider
6.UISlider //滑块 设置高度 UISlider * slider = [[UISlider alloc] initWithFrame:CGRectMake(20, 100, CGRec ...