我正在嘗試撰寫一個基于某個值的方法,它回傳一個我想在另一個方法中定義的屬性。但是,我遇到了一個奇怪的'Uncaught ReferenceError: Invalid left-hand side in assignment'錯誤。
如果我使用一種方法回傳物件的屬性并嘗試為其分配一個新值,它會吐出錯誤。但是,如果我呼叫 object.property 并為其分配一個新值,它就可以作業。
此外,我運行了一個測驗:(object.property == object.method(value)呼叫屬性)回傳 true!
看來我使用=正確。
const test = () => {
const y = 1;
const z = 2;
const mySelector = function(value) {
if (value > 0) {
return this.y;
}
else {
return this.z;
}
}
const definer = function (value){
mySelector(value) = 9;
}
return {y, z, mySelector, definer}
}
let testInstance = test();
// this line spits out a an error:
testInstance.definer(-1); // Uncaught ReferenceError: Invalid left-hand side in assignment
testInstance.z = 9; // but this is ok
testInstance.z == testInstance.mySelector(-1) // true
uj5u.com熱心網友回復:
mySelector(value) = 9你不能用這種方式分配任務。
我們可以想象這條線如下。
- 您將
-1引數提供給definer函式并呼叫它。 - 我們現在在定義函式內部,我們正在將值傳遞
-1給mySelector函式。 - 我們在
mySelector函式內部。-1不大于0。else 塊運行,我們將z對應的值回傳2給definer函式。 - 我們又在
definer函式中了。值2來自mySelector函式。我們現在可以寫2而不是mySelector(value).
生成的影像是2 = 9. 是的,我們找到了!這是“分配中無效的左側”錯誤。
也許現在更有意義的是什么導致了彈出的錯誤。
編輯
“最好的方法是什么?” 說最好的方法是這樣或那樣是不正確的。獲得所需結果的方法不止一種。
在回應您的評論時,我將再提幾點。
let testInstance = test()
該test函式回傳一個物件。這個物件有四個名為“ y, z, mySelector, definer”的屬性和為這些屬性定義的值。
該testIstance變數現在參考該物件。
testInstance.z = 9
在您撰寫的這一行中,您訪問物件的z屬性testInstance并更改其值。這里一切正常。
testInstance.z == testInstance.mySelector(-1)
但是這一行有更深的資訊要知道,這個關鍵字。
我不會在this這里詳細介紹關鍵字。因此,您可以通過閱讀和應用我給出的來源來更好地理解。但我將簡要解釋為什么這條線回傳true。
首先,我們不要忘記我們在本行的上一行中設定了物件的z屬性的值。( )testInstance9testInstance.z = 9
現在我們知道,當我們訪問等式左側物件的z屬性時,它會給我們 value 。讓我們模擬一下,testInstance9
9 == testInstance.mySelector(-1)
現在讓我們檢查等式的右側。我們呼叫物件的mySelector方法testInstance。此方法回傳this.y或this.z取決于條件。在我們的示例中,else 塊將因為-1. 主要部分從這里開始。
簡單地說,每當你創建一個 javascript 物件時,這個創建的物件的方法就可以使用this關鍵字訪問物件本身。這里的關鍵字this指向我們的testInstance物件。
MDN
當一個函式作為物件的方法被呼叫時,它的 this 被設定為呼叫該方法的物件。
讓我們繼續我們離開的地方,else 塊被處理并this.z回傳。
由于在我們的示例中我們正在呼叫物件的mySelector方法,因此關鍵字指向我們的物件。并且我們之前將物件的屬性值設定為。這就是為什么它從.testInstancethistestInstanceztestInstance99this.z
結果是9 == 9,真的。
關于“這個”的快速說明
ES5 函式
const test = () => {
const mySelector = function(value) {
console.log(this) // this -> points to the object itself
}
return { mySelector }
}
ES6 箭頭函式
const test = () => {
const mySelector = (value) => {
console.log(this) // this -> points to the window object
}
return { mySelector }
}
在您的示例中,mySelector函式是使用 es5 語法撰寫的,它指向testInstance物件本身。但如果它是用 es6 語法撰寫的,testInstance.z == testInstance.mySelector(-1)這里會回傳 false。因為this關鍵字將指向window物件,并且由于 window 物件沒有z屬性,所以它回傳undefined.
9 == undefined, 錯誤的。
最后一點,與其他語言相比,函式的this關鍵字在 JavaScript 中的行為略有不同。研究和實踐這個主題是理解結果的重要一步。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/520883.html
