我今天写了aproximatley这段代码:
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行{1}}和x
。
我的问题是:我的代码中是否可以包含y
和x
,包括私有变量和函数参数?如何在第5行和第6行将y
分配给x
和x
到y
以便它可以正常工作?
答案 0 :(得分:2)
在setXY
内,函数参数x
和y
shadowing 定义的局部变量x
和y
Point
函数的主体。
在javascript中,没有直接访问阴影变量的方法。通过声明您的参数名称以遮蔽局部变量,您已经使局部变量无法访问。
通常,在这种情况下,javascript devs不会尝试访问阴影变量,而是执行以下两种操作之一:
使用其他变量名称:
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.x
和this.y
可供参与this
的任何人访问,并且可以在{{1}的定义之外进行修改不使用Point
。继续之前的代码:
setXY
答案 1 :(得分:2)
简短的回答:不,这是不可能的。通过在this.setXY
方法中保留相同的名称,您实际上会覆盖父范围的变量。
你似乎允许原始x&要修改的值 - 为什么不简单地公开它们并将您的方法用作实用程序?
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;
}
}