[英]How to use the same name for private variables in JavaScript as for function arguments? (to make code look nicer)
我今天寫了這段代碼:
function Point () { // 1
var x, y; // 2
// 3
this.setXY = function (x, y) { // 4
x = x; // 5 doesn't work
y = y; // 6 doesn't work
} // 7
} // 8
我想讓setXY
API看起來不錯,所以我想在第4行上使用x
和y
。但是我也想讓我的代碼在內部很好,所以我在第2行上使用x
和y
作為私有變量。
我的問題是:對於私有變量和函數自變量,我的代碼中到處都有x
和y
嗎? 我將如何分配x
到x
和y
到y
線5和6,這樣是否可行?
在setXY
,函數參數x
和y
遮蓋了Point
函數主體中定義的局部變量x
和y
。
在javascript中,沒有直接的方法可以訪問陰影變量。 通過聲明參數名稱以隱藏局部變量,可以使局部變量不可訪問。
通常,在這種情況下,javascript開發人員不會嘗試訪問陰影變量,而是會執行以下兩項操作之一:
使用其他變量名稱:
function Point() { var _x, _y; this.setXY = function(newX, newY) { _x = newX; _y = newY; }; } p = new Point(); p.setXY( 5, 7 );
在this
存儲對象特定的值,而不是將其存儲為局部變量:
function Point() { this.setXY = function(x, y) { this.x = x; this.y = y; }; } p = new Point(); p.setXY( 5, 7 );
這兩種方法之間的主要區別在於
由於他們是局部變量, _x
和_y
是從定義的外部訪問Point
,所以他們不能除了通過更新setXY
。
由於它們是對象成員,因此引用this
對象的任何人都可以訪問this.x
和this.y
,並且可以在Point
定義之外進行修改,而無需使用setXY
。 繼續前面的代碼:
console.log( px, py ); // prints 5, 7 px = 11; console.log( px, py ); // prints 11, 7
簡短的回答:不,這不可能。 通過在this.setXY
方法中保留相同的名稱,可以有效地覆蓋父作用域的變量。
您似乎允許修改原始的x和y值-為什么不簡單地公開它們並將您的方法用作實用程序?
function Point (x, y) {
this.x = x;
this.y = y;
// set X,Y in a single statement
this.setXY = function (x, y) {
this.x = x;
this.y = y;
}
// utility example
this.distance = function (x, y) {
x = this.x - x;
y = this.y - y;
return Math.sqrt(x * x + y * y);
}
}
或者,定義一個對象來存儲具有相同名稱/鍵的變量:
function Point (x, y) {
// a private key store
var point = {
x: x || 0,
y: y || 0
};
this.setXY = function (x, y) {
point.x = x;
point.y = y;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.