閉包和作用域

this

this要在執行的時候才能有確認值,定義是無法確認

var a = {
  name: 'A',
  fn: function () {
    console.log(this.name)
  }
}

a.fn() //this === a
a.fn.call({
  name: 'B' //this === {name:'B'}
})
var fn1 = a.fn // this === window
fn1()

作用域

? js沒有塊級作用域 只有全局和函數作用域

if (true) { //無塊級作用域
  var name = 'james'
}
console.log(name)


var a = 100

//全局和函數作用域
function foo() {
  var a = 2020
  console.log('fn', a)
}

console.log(a)

作用域鏈

當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈。

當在內部函數中,需要訪問一個變量的時候,首先會訪問函數本身的變量對象,是否有這個變量,如果沒有,那么會繼續沿作用域鏈往上查找,直到全局作用域。如果在某個變量對象中找到則使用該變量對象中的變量值。

閉包

函數與對其狀態即詞法環境lexical environment)的引用共同構成閉包closure)。也就是說,閉包可以讓你從內部函數訪問外部函數作用域。

function init() {
  var name = "Mozilla"; // name 是一個被 init 創建的局部變量
  return function displayName() { // displayName() 是內部函數,一個閉包
    console.log(name); // 使用了父函數中聲明的變量
  }
}

var f = init();
var name = 'james'
f() //Mozilla

function init2(fn) {
  var name = 'james'
  fn()
}
var f = init();

init2(f)//Mozilla

常用于 函數作為返回值 和函數作為參數傳遞

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容