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

相關文章
相關標籤/搜索