js做用域以及做用域链

做用域:es6

做用域表示js中变量能够被哪些代码访问,js的做用域包含全局做用域和局部做用域,es6之前不包含块级做用域;bash

举个例子:函数

function foo() {
  console.log(a)  // 2
}
function  bar() {
  var a = 3 // 局部做用域
  foo()
}
var a = 2 // 全局做用域
bar() 
复制代码

全局做用域: 全局做用域能够将调用他的对象理解为window,也叫作0级做用域,在上面的例子中,函数 foo(), bar(), var a =2 均可以理解为0级做用域中spa

局部做用域:code

function  bar() {
  var a = 3
  foo()
  function foo() { // 局部做用域
    console.log(a) 
  }
}
var a = 2 // 全局做用域
bar()
复制代码

在上面的例子中,函数foo()写在了bar()里面。这种状况函数foo()就处于1级做用域,bar()函数中声明的var a = 3, 也就是1级做用域中的变量。对象

做用域是能够嵌套的,从而造成做用域链。因为做用域链的存在,能够让变量的查找向上追溯,即子函数能够访问父函数的做用域=>祖先函数的做用域=>直到全局做用域作用域

因此例子1中 foo()位于0级做用域,因此在console.log(a)的时候,他还会先在本身的做用域内找对应的变量,找不到事会沿着做用域往上找;it

相关文章
相关标签/搜索