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