如何在 JavaScript 中为私有变量使用与函数参数相同的名称? (使代码看起来更好)

Posted

技术标签:

【中文标题】如何在 JavaScript 中为私有变量使用与函数参数相同的名称? (使代码看起来更好)【英文标题】:How to use the same name for private variables in JavaScript as for function arguments? (to make code look nicer) 【发布时间】:2015-09-30 14:07:37 【问题描述】:

我今天写了 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 行使用 xy。但是我也想让我的代码在内部很好,所以我使用 xy私有变量在第 2 行。

我的问题是:是否可以在我的代码中到处都有xy,用于私有变量和函数参数?如何在第 5 行和第 6 行将 x 分配给 xy 分配给 y 以使其正常工作?

【问题讨论】:

有什么原因不能调用 x,y 参数吗?比如x2y2? 是的!像这样 - this.setXY = function (X, Y) @kevin628 这会使 API 变得丑陋。我想在任何地方使用xy 来获得漂亮的内部(私有部分)代码和API(外部API)。 @Maverick 有趣,大写 X 和 Y 用于函数参数 setXY 本身应该很清楚。如果另一位开发人员对参数名称感到心烦意乱,那么他或她是在错误的职业中。不要编写代码让 API 和文档看起来很吸引人;为相当聪明的开发人员编写自我记录的代码。 【参考方案1】:

简短回答:不,这是不可能的。通过在 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;
  

【讨论】:

我喜欢替代解决方案。除了通过point 对象外,我仍在代码中使用xy 我也喜欢第二种方法,虽然我不会经常使用它。您也可以在函数之外使用类似的约定,例如。 var point = new Point(); 没错,但是如果您允许直接使用 setXY 方法设置值,那应该不是问题【参考方案2】:

setXY 内,函数参数xy隐藏Point 函数体中定义的局部变量xy。 p>

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.xthis.y 是对象成员,因此任何引用this 的人都可以访问它们,并且可以在Point 的定义之外进行修改,而无需使用setXY。继续之前的代码:

    console.log( p.x, p.y ); // prints 5, 7
    p.x = 11;
    console.log( p.x, p.y ); // prints 11, 7
    

【讨论】:

感谢您的详细解答。如果没有更好的答案,我投了赞成票,并将在接下来的几天内接受答案。你的回答完美地解释了一切。方法 2 对安全编程很危险。方法 1 看起来不错,我将继续使用它,但我仍将在内部使用 x 而不是 x 并使用 newX 作为函数参数。后续问题:您如何看待使用setXY(xx, yy) - 变量名加倍?我刚想出了这个方案。或setName(namename)。或split(sizesize)。我想我比newX 更喜欢加倍变量名方案。 bodacydo:老实说,我认为你问错了问题。看起来您想为参数使用相同的名称以避免使“API 变得丑陋”。用户不应该通过阅读您的函数定义来学习您的 API,他们应该阅读文档。如果你有一个工具可以从你的函数定义生成文档,为什么不问如何让这个工具使用不同的参数名称呢? 第一种方法,为什么不用xy代替newXnewY作为参数呢? 冷蓝色:记录意图 你是如何记录的?是否有任何用于 javascript 的特殊文档工具?我以为大家都是看代码找api函数的?

以上是关于如何在 JavaScript 中为私有变量使用与函数参数相同的名称? (使代码看起来更好)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 模板中为循环创建唯一的 javascript 变量名?

全局、本地和私有函数 (Javascript)

如何在 .h 和 .cpp 中为类中的私有 char 数组编写 get 函数?

在 JavaScript 中为全局变量列表赋值

C++ 友元函数不起作用,在此上下文中为私有错误

javascript在私有作用域中定义私有变量和私有函数