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

  1. 由变量开始谈
      习惯性先来段代码:
var x = "globol value";var getValue = function(){alert(x);    //弹出"undefined"var x = "local value";alert(x);    //弹出"local value";}getValue();

其实理解这个问题的关键就是要清楚x的作用域。
  第一个var x中的x是全局变量,说到这里顺带说下,js解释器在执行任何代码之前会先创建一个全局对象(global object),全局变量就是相当于这个全局对象的一个属性。同理,对于getValue这个函数,就会生成一个叫做调用对象的东西,局部变量就是这个调用对象的属性,例子中第二个var x中的x就是局部变量。
要理解的话,其实我们可以对比传统面向对象的(如JAVA、C#)中的变量的作用域,我们知道C#中的变量作用域是块级的,即这个变量只能活动在定义他的一个直接外界内,如if子句内,for子句内定义的变量外界是无法读取的。而js中呢,变量却不是这样的,在同一个函数内定义的变量其它的成员是可以访问的。看个例子会清楚很多:

function test(o){var i = 0;if(typeof o == "object"){var j = 0;                    for(var k=0; k < 10; k++){document.write(k);}document.write(k);            //k是可以被访问到的,即使他在for子句内}document.write(j);                //说明j是可以被访问到的,即使他在if子句内}

  当定义了一个函数后,当前的作用域就会被保存下来,并且成为函数内部状态的一部分,这个是很重要的一个概念。下面我们回到开篇的那个例子,当getValue函数被定义的时候,他的作用域被保存起来,还有被加到作用域链上,他的上端就是全局执行环境。当调用getValue方法的时候,js解释器首先会把作用域设置为定义函数的时候的那个作用域(即之前保存那个),接下来,他在作用域的前加上调用对象即getValue这个函数,再在他的上端加上全局对象。

  1. 深入探索
      这个作用域链其实和原型链有点相似,也好似在很作用域内找不到就会向上去找。比方说开篇那个例子,找x的时候,(对了这里要先介绍下js的预定义机制,就是js解释器会先对var定义的变量进行初始化,应该说只是起了定义的作用当没赋值),会先在本作用域内找,有预定义知可以找到x,但是没赋值,所以是undefined值。知道了这点我们来知道开篇那个代码其实是等价于下面这个的:
var x = "globol value";var getValue = function(){var x;alert(x);    //弹出"undefined"x = "local value";alert(x);    //弹出"local value";}getValue();

  楚了以上关于词法作用域的概念后,我们就不难理解闭包的概念了,他只是用到了作用域链的不可向下性(我取的名词..),即下面的作用域可以访问上面的,但上面的不可以访问下面的。当然这只是构成闭包的一个条件,闭包更重要的还是外部函数持有内部函数的一个嵌套函数的引用,由于闭包不是本文主要要讨论的(ps:谈封装的时候会说到),所以只是简单看下例子:

function foo(){var age = 10;function boo(){age += 10;return age;}return boo;}var tx = new foo();alert(tx());    //20

转载于:https://www.cnblogs.com/feiyu6/p/7232340.html

javascript的词法作用域相关推荐

  1. JavaScript之词法作用域和动态作用域

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

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

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

  3. 你不知道的JavaScript之词法作用域

    词法作用域 总结一下作用域的定义:作用域就是一套规则,这套规则用于引擎如何进行查找变量以及在哪找到变量(可以看看之前我博客写的引擎和作用域之间的对话). 作用域分为词法作用域(也叫静态作用域)和动态作 ...

  4. 再探Javascript词法作用域

    写在前面的话:每个人都会犯错--有时候'孰能无过,过而能改,善莫大焉',有时候知道自己错了却没有机会更改.其实,错了并不仅仅是错了,做错了,除了及时改正和弥补之外,最重要的是为自己犯的错承担所有责任. ...

  5. javascript之深入理解词法作用域

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

  6. javaScript中变量作用域

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

  7. 深入学习js之——词法作用域和动态作用域

    开篇 当我们在开始学习任何一门语言的时候,都会接触到变量的概念,变量的出现其实是为了解决一个问题,为的是存储某些值,进而,存储某些值的目的是为了在之后对这个值进行访问或者修改,正是这种存储和访问变量的 ...

  8. JavaScript词法作用域的简单介绍

    by Michael McMillan 迈克尔·麦克米兰(Michael McMillan) JavaScript词法作用域的简单介绍 (An easy intro to Lexical Scopin ...

  9. JavaScript夯实基础系列(一):词法作用域

      作用域是一组规则,规定了引擎如何通过标识符名称来查询一个变量.作用域模型有两种:词法作用域和动态作用域.词法作用域是在编写时就已经确定的:通过阅读包含变量定义的数行源码就能知道变量的作用域.Jav ...

最新文章

  1. AIR 配置文件(*-app.xml)说明(转)
  2. unity3d读取android文本文件,职场小白求助Unity项目Android端读取CSV文本问题
  3. linux中wps默认安装目录,centos6.5 安装wps linux
  4. 【转】图解phpstorm常用快捷键
  5. 关系抽取、时间抽取,实践项目推荐
  6. python扫描字符串文本时下线_python:SyntaxError:扫描字符串li时的EOL
  7. ORA-00997: 非法使用 LONG 数据类型
  8. CCF 201503-2 数字排序
  9. Unity 中 Png转Texture2D再转Sprite
  10. bootstrap modal远程加载的两种方式
  11. MOT多目标跟踪之JDE
  12. cr3格式是什么意思_如何用PS导入佳能CR3格式图片?
  13. 前端-微信浏览器无法下载附件解决方法?
  14. php网上订餐,php网上订餐系统
  15. 用户流失生命周期如何最大化延缓或延长(包含引流-促活-问卷调研-流失召回话术)
  16. 对于【没有苹果开发账号,只有p12文件和mobileprovision文件进行打包】文章的补充
  17. 会计做什么副业好?分享几个适合会计的副业
  18. 唱作音乐人朱卫明新歌全网首发,当初恋遇到《龙仙街》
  19. win10删除第三方增加的“设备和驱动器”
  20. JZ-008-跳台阶

热门文章

  1. inno setup修改properties格式内容_linux内核修炼之setup
  2. jpanel不使用jframe保存的图片为空_使用DataBinding还在为数据处理头疼?这篇文章帮你解决问题
  3. 计算机基础知识整理大全_【干货整理】高中文言文基础知识大全,速度收藏!...
  4. python字符串拼接数字_python字符串和数值操作函数大全(非常全)
  5. python 三分钟入门_Cython 三分钟入门教程
  6. android 图标拖动不了,拖动式选项卡(仿android) 添加了上下拉刷新后,下拉即刷新,而不是滚动到顶后再刷新,同时还想问一下正在刷新的图标怎么移到选项卡下...
  7. Java项目:前台+后台精品水果商城系统设计和实现(java+Springboot+ssm+mysql+jsp+maven)
  8. php数据库html文本,关于php,mysql,html的数字分页和文本_php
  9. 张仰彪第二排序法_C语言中的最常用的两种排序算法你知道吗?
  10. the job was canceled什么意思_这些英语短语,因为相差一个“the”导致意思大不相同!...