ES6(一)—— 做用域

告別拖延症,今天開始更新ES6-ES10經常使用的全部新特性,僅做爲學習筆記,勿噴。bash

目錄

  • ECMAScript數據結構

    • ECMAScript概述
    • ES2015概述
    • 新特性的分類
  • 做用域閉包

    • 全局做用域
    • 函數做用域
    • 塊級做用域(ES6新增)
    • 動態做用域
  • ES6-ES10學習版圖

ECMAScript

ECMAScript概述

  • ECMAScript一般看作JavaScript的標準化規範,實際上JavaScript是ECMAScript的擴展語言。ECMAScript只是提供了最基本的語法。

JavaScript = ECMAScript + BOM + DOM函數

  • 2015年開始ES保持每一年一個版本的迭代,而且開始按照年份命名。

ES2015概述

  • 相比於ES5.1的變化比較大
  • 自此,標準命名規則發生變化
  • ES6泛指是2015以後的全部新標準,之後要看清楚是特指仍是泛指

新特性的分類

  • 解決原有語法上的一些問題或者不足
  • 對原有語法進行加強
  • 全新的對象、全新的方法、全新的功能
  • 全新的數據類型和數據結構

做用域

  1. 全局做用域
  2. 函數做用域
  3. 塊狀做用域
  4. 動態做用域
對象 類型
global/window 全局做用域
function 函數做用域(局部做用域)
{} 塊狀做用域(if語句,for語句)
this 動態做用域

全局做用域

在全局使用var定義的變量爲全局變量學習

案例一:this

var abc = 1234
abcd = 2345

delete abc //false
console.log(abc) //1234
delete abcd //true
console.log(abcd) //abcd is not defined

// abc是一個全局對象,可是abcd不是全局變量,而是做爲window對象的屬性存在的,
// 可是由於window是全局對象,因此看上去它也具有全局屬性,擁有全局做用域

案例二:spa

function test(){
    ab = 45
}
test()

console.log(ab) //45
//在函數內部沒有使用var定義的變量,都掛載在window上,不是全局變量,可是擁有全局做用域

函數做用域

在函數內部定義的變量,擁有函數做用域/局部做用域code

function test(){
    var a = 3
    return a + 4
}
console.log(test()) // 7 
console.log(a) //a is not defined

如何讓a在函數做用域中,可是某些值共享?對象

  1. return
  2. 閉包

塊級做用域(ES6新增)

ES5blog

// ES5
function test(){
    var a = 3
    if (a === 3) {
        var b = 4
        console.log('abc')
    } else {
        console.log('abcd')
    }
    console.log(b)  // 4
    return a + 4
}

//在if的塊中沒法造成壁壘,在{}中定義的變量在外界仍是可使用的
//ES6將{}中的東西進行了獨立

function test () {
    var a = 3
    function test2 () {
        var b = 4
        return a + b
    }
    return test2
}

/* test裏面的變量對test2是共享的,a的值是能夠取到的。
根據函數的做用域鏈:
執行test2中的函數,首先定義b,而後return中找a,沒有找到就去上一個函數中找,找到了a
若是在test中找不到a,最後會一直找到window
*/

ES6

function test(){
    var a = 3
    if (a === 3) {
        let b = 4
        console.log('abc')
    } else {
        console.log('abcd')
    }
    console.log(b)  // b is not defined
    return a + 4
}

// 若是想要使用塊狀做用域,可是此時不能用var,由於var有一個變量提高機制。
// 但凡看到了var,就會提高到當前做用域最頂層,因此只能使用let,const

動態做用域

this 是很是特殊的關鍵詞標識符,在每一個函數的做用域中被自動建立。
只能在執行階段才能決定變量的做用域。

window.a = 3
function test () {
    console.log(this.a)
}
test()  // 3
test.bind({ a:100 })()  // 100

// 由於this是一個動態指向,不是固定指向。因此咱們稱這個爲動態做用域。
// bind是讓函數動態綁定到一個對象上去,這個時候this指向對象自己,因此會致使同一個函數有不一樣的效果。

詞法做用域

  • js採用詞法(靜態)做用域,所以開啓動態做用域請藉助bind,with,eval等。
  • bash採用的是動態做用域
靜態做用域 動態做用域
變量的做用域是在定義時決定而不是執行時決定,通常經過靜態分析就能肯定。 只能在執行階段才能決定變量的做用域。
// 通過驗證,js默認採用靜態做用域
// a 在foo調用的時候沒有在當前函數做用域中找到,因此按照書寫代碼順序往外層找,就是var a = 2,而不是取bar函數裏面找
function foo() {
    console.log(a)  // 2
}

function bar() {
    var a = 3
    foo()
}

var a = 2
bar()

學習版圖

ES6-ES10學習版圖

相關文章
相關標籤/搜索