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
常用于 函數作為返回值 和函數作為參數傳遞