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

时间:2015-07-12 04:01:31

标签: javascript variables interface private public

我今天写了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。但是我也希望我的代码内部很好,所以我使用{私有变量在第2行{1}}和x

我的问题是:我的代码中是否可以包含yx,包括私有变量和函数参数?如何在第5行和第6行将y分配给xxy以便它可以正常工作?

2 个答案:

答案 0 :(得分:2)

setXY内,函数参数xy shadowing 定义的局部变量xy Point函数的主体。

在javascript中,没有直接访问阴影变量的方法。通过声明您的参数名称以遮蔽局部变量,您已经使局部变量无法访问。

通常,在这种情况下,javascript devs不会尝试访问阴影变量,而是执行以下两种操作之一:

  1. 使用其他变量名称:

    function Point() {
      var _x, _y;
      this.setXY = function(newX, newY) {
        _x = newX;
        _y = newY;
      };
    }
    p = new Point();
    p.setXY( 5, 7 );
    
  2. 将对象特定值存储在this而不是本地变量中:

    function Point() {
      this.setXY = function(x, y) {
        this.x = x;
        this.y = y;
      };
    }
    p = new Point();
    p.setXY( 5, 7 );
    
  3. 这两种方法的主要区别在于

    1. 由于它们是局部变量,_x_y无法从Point的定义之外访问,因此无法更新 通过setXY

    2. 由于他们是对象成员,this.xthis.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;
  }
}