JS中新手容易困惑的問題,是變量?是屬性?this的指向?

問題

case1:javascript

var a = {
    name: 'jiavan',
    bname: name
};
console.log(a.bname);

case2:java

var a = {
    name: 'jiavan',
    bname: this.name
};
console.log(a.bname);

case3:瀏覽器

var a = {
    name: 'jiavan',
    bname: a.name
};
console.log(bname);

分析

先看case1,這是一個基礎差的同窗常常犯的一個錯誤,在對象內部,把對象的屬性當變量使用,它的輸出結果是空的,那麼爲何呢?我用新的一段代碼解釋下:函數

var a = {
    'name': 'jiavan',
    bname: name
};
console.log(a.bname);

注意'name'與name的區別,一個是對象屬性,一個是變量,並且重要的是在對象內的這個name變量尚未被var聲明,因此成爲了全局變量,不信你能夠看看window下是否掛載了一個name。this

case2,this是一個古老的傳說,上面的結果會與case1同樣。值得注意的是,不少人沒有搞懂this是有誰生成的,具體的值是什麼,上面直接在對象的屬性值中使用了this,此時this是指向全局,即window的(瀏覽器環境下),那麼this什麼時候生成。code

其實this是有函數生成的,它是函數的一個內部屬性,與arguments同樣也是函數的內部屬性,它是在函數執行時被生成,那麼值呢?this的值始終是指向函數據以執行的環境。簡單的能夠理解爲調用函數的對象。對象

在js中只有兩種做用域,一種是全局,一種是函數級做用域(能夠利用其模仿塊級做用域),直接在對象屬性中使用this那麼此時this就是window,並且還在全局上掛載了一個name屬性沒有值。ip

case3,看了前面兩個的分析,第三個應該就很容易理解了,在cname屬性上使用了a.name而a尚未完成定義是不能直接使用的,此時直接給window掛載了一個變量a還對其進行了屬性name的訪問,變量不賦初值是默認undefined的,那麼你能對一個undefined進行屬性訪問?作用域

嗯,大概就這樣,有不對不嚴謹的地方歡迎指出。console

相關文章
相關標籤/搜索