如何在JavaScript中使用与函数参数相同的私有变量名称?(使代码看起来更漂亮)
我今天写了一篇关于这段代码的文章:如何在JavaScript中使用与函数参数相同的私有变量名称?(使代码看起来更漂亮),javascript,variables,interface,private,public,Javascript,Variables,Interface,Private,Public,我今天写了一篇关于这段代码的文章: function Point () { // 1 var x, y; // 2 // 3 this.setXY = function (x, y) { // 4 x = x; //
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
?如何在第5行和第6行将x
分配给x
和y
以使其工作?在setXY
中,函数参数x
和y
隐藏在点
函数体中定义的局部变量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 );
function Point() {
this.setXY = function(x, y) {
this.x = x;
this.y = y;
};
}
p = new Point();
p.setXY( 5, 7 );
\ux
和\uy
无法从点的定义之外访问,因此只能通过setXY
进行更新
this.x
和this.y
对this
有引用的任何人都可以访问,并且可以在点
定义之外进行修改,而无需使用setXY
。要继续先前的代码,请执行以下操作:
console.log( p.x, p.y ); // prints 5, 7
p.x = 11;
console.log( p.x, p.y ); // prints 11, 7
在
setXY
中,函数参数x
和y
隐藏在点
函数体中定义的局部变量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 );
function Point() {
this.setXY = function(x, y) {
this.x = x;
this.y = y;
};
}
p = new Point();
p.setXY( 5, 7 );
\ux
和\uy
无法从点的定义之外访问,因此只能通过setXY
进行更新
this.x
和this.y
对this
有引用的任何人都可以访问,并且可以在点
定义之外进行修改,而无需使用setXY
。要继续先前的代码,请执行以下操作:
console.log( p.x, p.y ); // prints 5, 7
p.x = 11;
console.log( p.x, p.y ); // 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;
}
}
简短回答:不,这是不可能的。通过在
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;
}
}
有什么原因不能把x,y参数叫做别的吗?比如,
x2
和y2
?是的!像这样-this.setXY=function(X,Y){
@kevin628这会让API变得难看。我想在任何地方都使用X
和Y
来编写漂亮的内部(私有部分)代码和API(外部API)@Maverick有趣,函数参数的大写X和YsetXY
本身应该是清楚的。如果另一个开发人员因参数名称而心脏病发作,他或她从事的职业是错误的。不要编写代码使API和文档在视觉上看起来很吸引人;编写代码是向理性人自我记录的ly intelligent developer.有什么原因不能调用x,y参数吗?比如,x2
和y2
?是的!比如-this.setXY=函数(x,y){
@kevin628,这会让API变得丑陋。我想在任何地方都使用x
和y
,以获得漂亮的内部(私有部分)代码和API(外部API)@Maverick有趣,函数参数的大写X和YsetXY
本身应该是清楚的。如果另一个开发人员因参数名称而心脏病发作,他或她从事的职业是错误的。不要编写代码使API和文档在视觉上看起来很吸引人;编写代码是向理性人自我记录的ly intelligent developer。感谢您提供详细的答案。如果没有更好的答案,我将在未来几天接受答案。您的答案完美地解释了一切。方法2对安全编程来说是危险的。方法1看起来不错,我会选择它,但我仍然会在内部和外部使用\u x
使用newX
作为函数参数。后续问题:您认为使用setXY(xx,yy)
-加倍变量名怎么样?我刚刚提出了这个方案。或者setName(namename)
。或者split(sizesize)
。我想我更喜欢加倍变量名方案,而不是newX