javascript作用域
2013-11-21 20:10
232 查看
几乎所有语言都有作用域的概念,而且相当重要,是设计一门语言时不可回避的问题,
大体来说,作用域一般可以分为两种,即静态作用域和动态作用域,一般情况下,
多采用静态作用顾规则,又叫词法作用域,是指作用域在词法分析阶段就可以确定,
而动态作用域则采用较少,因为其实现较为复杂。对于javascript来说,其可以成为
静态作用域,虽然不完全是。所谓的作用域,可以理解为变量的可访问范围,也即在
代码的哪个区域可以访问。其实这是一种比较表面的说法,其实质是一个当一个变量
被分配了存储空间后,哪些代码可访问该空间。一般情况下,比如c语言,拥有函数
作用域和块级作用域,也就是说函数内部和块内的变量不可以被外界访问。但是在javascript
中没有块级作用域,其唯一能形成局部作用域的是函数,也就是说在函数内部的变量不
能被外界访问。这本身并没有什么难以理解的,但是javascript允许函数进行嵌套定义,
也就是说在函数内部还可以定义函数,这样就出现了嵌套的作用域。内部函数可以访问
外部函数的变量。如何实现这种作用域呢?javascript是用作用域链的方式实现静态作用域
和函数作用域的。当一个函数被定义或者是被创建的时候,其可访问的变量范围已经被确定
下来,ecmascript规范中有一个内部属性[[scope]],该属性就包含了所有他可以访问的变量
。当函数执行的时候,其内部的变量包括参数会被组织成一个叫活动对象的内部实现,把
该活动对象放置于[[scope]]的顶端,就形成了该函数所有课访问变量的集合。可以看出,
[[scope]]也是一个由很多变量对象组成的,这可以看做事一个链,访问时从链顶到链底查询
变量,这就是作用域链的实现方式。
大体来说,作用域一般可以分为两种,即静态作用域和动态作用域,一般情况下,
多采用静态作用顾规则,又叫词法作用域,是指作用域在词法分析阶段就可以确定,
而动态作用域则采用较少,因为其实现较为复杂。对于javascript来说,其可以成为
静态作用域,虽然不完全是。所谓的作用域,可以理解为变量的可访问范围,也即在
代码的哪个区域可以访问。其实这是一种比较表面的说法,其实质是一个当一个变量
被分配了存储空间后,哪些代码可访问该空间。一般情况下,比如c语言,拥有函数
作用域和块级作用域,也就是说函数内部和块内的变量不可以被外界访问。但是在javascript
中没有块级作用域,其唯一能形成局部作用域的是函数,也就是说在函数内部的变量不
能被外界访问。这本身并没有什么难以理解的,但是javascript允许函数进行嵌套定义,
也就是说在函数内部还可以定义函数,这样就出现了嵌套的作用域。内部函数可以访问
外部函数的变量。如何实现这种作用域呢?javascript是用作用域链的方式实现静态作用域
和函数作用域的。当一个函数被定义或者是被创建的时候,其可访问的变量范围已经被确定
下来,ecmascript规范中有一个内部属性[[scope]],该属性就包含了所有他可以访问的变量
。当函数执行的时候,其内部的变量包括参数会被组织成一个叫活动对象的内部实现,把
该活动对象放置于[[scope]]的顶端,就形成了该函数所有课访问变量的集合。可以看出,
[[scope]]也是一个由很多变量对象组成的,这可以看做事一个链,访问时从链顶到链底查询
变量,这就是作用域链的实现方式。
相关文章推荐
- JavaScript作用域
- JavaScript作用域
- JavaScript作用域
- javascript作用域
- javascript作用域
- Javascript作用域
- 来来来,一起五句话搞定JavaScript作用域
- javascript作用域的一个小例子
- JavaScript作用域和闭包
- javascript作用域(Scope),简述上下文(context)和作用域的定义
- 细说javascript作用域
- JavaScript作用域
- JavaScript作用域学习笔记
- JavaScript作用域原理(二)——预编译
- JavaScript作用域和作用域链/变量,函数提升
- javascript作用域
- javascript作用域和闭包之我见
- JavaScript作用域
- JavaScript作用域
- Javascript作用域详解。