[ES6]1.1作用域

作用域

  1. 全局作用域(global/window)
  2. 函數(shù)作用域/局部作用域(function)
  3. 塊狀作用域({})
  4. 動態(tài)作用域(this)

1、全局作用域

在最外層使用var定義全局作用域的變量。

var course = "es6"

在任意位置創(chuàng)建未定義的變量。

function foo () {
    course = "es6"
}
// 在此處及任何位置都可以調(diào)用
console.log(course)

(不建議使用)而在在外層,使用let定義變量時,它的作用域?yàn)槿謮K作用域。

let a3 = 3

console.log("a3" in window); // false

以上定義全局作用域的三種方法總結(jié)為:

  1. 使用var,是定義了當(dāng)前作用域的一個變量,可以使用window調(diào)用,但不能使用delete刪除。
  2. 未定義的變量,同樣可以使用window調(diào)用,但其作為window對象的一個屬性,可以使用delete刪除。
  3. 使用let只是在當(dāng)前作用域塊定義了一個變量,不是window的屬性,所以也無法使用window調(diào)用。
var a1 = 1
a2 = 2
let a3 = 3
console.log(window.a1, 'a1' in window) // 1 true
console.log(window.a2, 'a2' in window) // 2 true
console.log(window.a3, 'a3' in window) // undefined false

2、函數(shù)作用域

在函數(shù)內(nèi)部定義的變量,就成為局部作用域,只作用于函數(shù)內(nèi)部。

function bar() {
    var testValue = 'inner'
}

console.log(testValue) // 報(bào)錯:ReferenceError: testValue is not defined

如果想兌取函數(shù)內(nèi)的變量,必須使用return或者閉包,這里著重描述一下閉包。

閉包

一個函數(shù)和它的周圍狀態(tài)的引用捆綁在一起的組合。

當(dāng)函數(shù)執(zhí)行的時候,其內(nèi)部的自由變量(未在函數(shù)內(nèi)部定義)的取值,是根據(jù)函數(shù)定義的地方向上查找它的值。

function test() {
    const a = 1
    return function () {
        console.log('a', a)
    }
}

const fn = test()
const a = 2
fn() // a 1

3、塊狀作用域

有{}的就是塊,在ES5中使用var定義變量時沒有塊作用域的,會因?yàn)関ar的變量提升機(jī)制,將變量提升到當(dāng)前作用域的最上層。

if (true) {
    var a = 1
}
console.log(a); // a

相當(dāng)于

var a
if (true) {
    a = 1
}
console.log(a);

在ES6中,使用let聲明變量,就可用吧變量的作用域限制在當(dāng)前塊中。

if (true) {
    let a = 1
}
console.log(a); // a is not defined

動態(tài)作用域

window.a = 3

function test() {
    console.log(this.a)
}

test.bind({
    a: 2
})() // 2
test() // 3

通俗的講變量的作用域是在定義時決定而不是執(zhí)行時決定,也就是說詞法作用域取決于源碼,通過靜態(tài)分析就能確定,因此詞法作用域也叫做靜態(tài)作用域。 相反,只能在執(zhí)行階段才能決定變量的作用域,那就是動態(tài)作用域。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容