阅读 25

js作用域以及作用域链

作用域:

作用域表示js中变量可以被哪些代码访问,js的作用域包含全局作用域和局部作用域,es6以前不包含块级作用域;

举个例子:

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

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

局部作用域:

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)的时候,他还会先在自己的作用域内找对应的变量,找不到事会沿着作用域往上找;

关注下面的标签,发现更多相似文章
评论