做用域javascript
在Javascript里,做用域有两种:全局做用域和局部做用域前端
1)全局做用域java
全局做用域是最外围的一个执行环境。根据ECMAScript实现所在的宿主环境不一样,表示执行环境的对象也不同。在Web浏览器中,全局做用域被认为是window对象,所以全部全局变量和函数都是做为window对象的属性和方法建立的。浏览器
举个例子:函数
var a = 123; console.log(window.a) //输出结果为123
能够说 var a = 123 等价于 window.a,能够经过window.a的方式获取变量a的值spa
在全局做用域下,建立的变量是全局变量(global variable),能够在函数内部读取对象
2)局部做用域blog
每一个函数都有本身的执行环境,在这执行环境就是局部做用域,因此通常也称为函数做用域,而在局部做用域中建立的变量称为局部变量 注意:要用var声明ip
function abc(){ var x = 2; }
若是在函数里省略了var声明变量,建立的是全局变量,咱们要特别注意作用域
在函数里建立的局部变量(local variable),在函数外是没法读取的,只能在它的区块内使用
做用域链
var a = 1; function foo(){ var b = 2; function bar(){ var c = 3; console.log(a+b+c); } bar(); } foo()
这里函数bar运行a+b+c,可是函数里里没有变量b和c,就会从自身往上依次寻找变量,这个搜索机制就是做用域链。这个例子的搜索顺序:bar->foo->window
在Javascript高程中的定义是这样的:
当代码在一个环境中执行时,会建立变量对象的一个做用域链(scope chain)。做用域链的用途,是保证对执行环境有权访问的全部变量和函数的有序访问。做用域链的前端,始终都是当前执行的代码所在环境的变量对象。若是这个环境是函数,则将其活动对象(activation object)做为变量对象。活动对象在最开始时只包含一个变量,即 arguments 对象(这个对象在全局环境中是不存在的)。做用域链中的下一个变量对象来自包含(外部)环境,而在下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境;全局执行环境的变量对象始终都是做用域链中的最后一个对象。
标识符解析是沿着做用域链一级一级地搜索标识符的过程。搜索过程始终从做用域链的前端开始,而后逐级地向后回溯,直至找到标识符为止(若是找不到标识符,一般会致使错误发生)。
简单来讲,就是在局部做用域中会先在自身的变量对象中搜索变量和函数名,若是搜索不到则会再上一级寻找,仍是搜不到就会再往上上一级,直至搜索到为止,这个过程会延续到全局做用域,全局做用域的变量始终是做用域链中的最后一个对象