這多是須要系統學js的人最重要且容易被忽略的一些概念

寫這篇文章以前是看了這篇文章講關於箭頭函數中this指向的問題,因而藉此把相關的函數,構造函數,new,this,箭頭函數的一些概念結合本身的理解又理了一遍,想着好好複習一下,最後有了寫這篇文章的想法。我不太喜歡說一些太專業的話(本身菜,無法專業),因此都是本身理解以及本身總結最後得出的結論,首先看下下面這四個控制檯的輸出結果:es6

1.
var a = 11
function test () {
    this.a = 22
    let b = function () {
        consolve.log(this.a)
    }
    b()
}
var x = new test()  =>  11
x.a  =>  22

2.
var a = 11
function test () {
    this.a = 22
    let b = function () {
        consolve.log(this.a)
    }
    b()
}
var x = test()  =>  22
x.a  =>  Uncaught TypeError: Cannot read property 'a' of undefined

3.
var a = 11
function test () {
    this.a = 22
    let b = () => {
        consolve.log(this.a)
    }
    b()
}
var x = new test()  =>   22
x.a  =>  22

4.
var a = 11
function test () {
    this.a = 22
    let b = () => {
        consolve.log(a)
    }
    b()
}
var x = new test()  =>   11
x.a  =>  22

若是你耐心得看完了這四段,而且你所想的結果就是控制檯的結果,那接下去你就能夠不用看了,由於我要講的你應該都懂,不過若是你有某段不明白,或者大部分不清楚,那下面的內容仍是很值得看看而且理解理解的,畢竟這些真的蠻重要。函數

首先提幾個概念:

執行上下文(執行環境):當JavaScript代碼執行的時候,會進入不一樣的執行上下文,這些執行上下文會構成了一個執行上下文棧(Execution context stack,ECS)。這個上下文棧就是js執行程序的基礎。this

this: 它是動態的,有人稱它爲動態上下文,我以爲不太對,this指向一個環境對象(表明這個執行環境),這是一個對象,並且是一個普通對象,而不是指向一個執行環境。.net

如下是我本身結合上面的內容的總結:

函數(function): 函數它本身就是一個對象,它用來裝一些等着執行的代碼,像層殼同樣,你不用它,它裏面的代碼是不會執行的,它身上綁着this(因此函數有本身的執行環境)。prototype

new : 用到new說明有函數被看成構造函數來調用了。new會返回一個對象,像這裏var x = new test()的變量x就指向這個返回出來的對象,new在返回對象以前會把函數殼裏面的代碼拿出來執行一遍,可是,此時殼被剝去了,構造函數裏面的函數執行環境天然就變了,就像這裏的:code

let b = () => {
       consolve.log(this.a)
   }
   b()

天然b()暴露給了這會兒在外面的執行環境(控制檯的話是window),可是構造函數會將本身的this給它建立出來的對象(也能夠說給出的this成了這個對象),因而this.a = 22a這個屬性被掛到了新建的對象上。
最後專業點的話能夠這樣模擬一下new作的一系列操做(這樣就扯到原型鏈繼承的東西了這裏暫時不須要管):對象

new Animal("cat") = {

    var obj = {};  // 新建一個對象

    obj.__proto__ = Animal.prototype;  // 實現原型鏈

    var result = Animal.call(obj,"cat");  // 用call給this

    return typeof result === 'object'? result : obj;
}

箭頭函數:這個es6出來的,如今運用普遍的東西跟函數有點不太同樣,我這裏只討論一點,就是它本身身上根本沒綁着this。因此在它裏面調用this須要往父級去找,也就是它的this是繼承自父執行環境的,而不是像有些人對其的解釋,它的this一開始就固定了。也正是由於它沒有this,因此也就不能用做構造函數,也就無法new。雖然最後結果是對的,但解釋不太對。blog

相關文章
相關標籤/搜索