2015-02-06 16 views
0

比方說,我有兩個對象,如使用鍵值對同一對象的內部本身在javascript「這個」

var a = { 
    b: 1, 
    c: this.b 
}; 

而且

var funcObj = { 
    b : function() { 
     return 1; 
    }, 
    c: function() { 
     console.log(return this.b()) 
    } 
} 

在登錄這兩個像

console.log(a.c)//results undefined 
console.log(funcObj.c()) //results 1 

爲什麼不能第一個函數使用這個屬性,但第二個可以? 我真的很困惑。

+1

因爲第一個示例顯示了一個對象字面值,並且沒有函數作用域。 – Trace 2015-02-06 02:54:13

回答

3

答案取決於this在每種情況下引用的內容。在JavaScript中,當調用當前函數時,this綁定到點(。)左側的任何對象。如果我們不在函數中,事情會變得更有趣 - this可能是全局的window對象或undefined,這取決於環境。

在第一個示例中,this的值取決於周圍的上下文。隨着JavaScript構建您的對象a,它將評估this.b。不管對象this目前綁定的沒有b屬性,所以c屬性設置爲undefined

在第二個示例中,當您撥打funcObj.c()時,函數中的this綁定到funcObj。所以,當你要求b屬性時,你會得到你在上面定義的bfuncObj.b是一個函數的事實實際上是不相關的。以下內容也適用:

var funcObj = { 
    b : 1, 
    c: function() { 
     console.log(return this.b) 
    } 
} 
1

您不能在聲明中引用其他屬性作爲Javascript字面聲明的一部分。所以,在你的Javascript文字聲明:

var a = { 
    b: 1, 
    c: this.b 
}; 

this未設置爲你想要什麼,a尚未,因此還不能引用它要麼初始化。在字面聲明時根本無法觸及其他屬性。這是Javascript當前規範的一個限制。你可以這樣做,而不是:

var a = { 
    b: 1 
}; 
a.c = a.b; 

因爲a在這一點上是完全形成,然後可以將它引用其他屬性。


或者,在現代瀏覽器,你甚至可以使用一個getter得到的b這樣的「活」的版本(這是不完全一樣的功能你問的,因爲它是一個「活」的b版本,將跟蹤它的值),但顯示了另一種可能性:

var a = { 
    b: 1, 
    get c() { 
     return b; 
    } 
}; 

console.log(a.c); //results 1 

在你的第二個例子:

var funcObj = { 
    b : function() { 
     return 1; 
    }, 
    c: function() { 
     console.log(return this.b()) 
    } 
} 

console.log(funcObj.c()) //results 1 

您正在致電funcObj.c(),並將this的值設置爲cfuncObj,因此您可以通過this參考其他屬性。


這裏的主要區別是,this未設置爲對象的JavaScript字面定義(您的第一個例子)的內部,但是this是,當你調用一個方法,在funcObj.c()設置的對象。

+0

我想你的意思是在你的第二個例子中寫'a.c = a.b;'。 – 2015-02-06 19:22:11

+0

@ChrisBouchard - 是的。現在修復。 – jfriend00 2015-02-06 19:26:11

相關問題