Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中使用与函数参数相同的私有变量名称?(使代码看起来更漂亮)_Javascript_Variables_Interface_Private_Public - Fatal编程技术网

如何在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和Y
    setXY
    本身应该是清楚的。如果另一个开发人员因参数名称而心脏病发作,他或她从事的职业是错误的。不要编写代码使API和文档在视觉上看起来很吸引人;编写代码是向理性人自我记录的ly intelligent developer.有什么原因不能调用x,y参数吗?比如,
    x2
    y2
    ?是的!比如-
    this.setXY=函数(x,y){
    @kevin628,这会让API变得丑陋。我想在任何地方都使用
    x
    y
    ,以获得漂亮的内部(私有部分)代码和API(外部API)@Maverick有趣,函数参数的大写X和Y
    setXY
    本身应该是清楚的。如果另一个开发人员因参数名称而心脏病发作,他或她从事的职业是错误的。不要编写代码使API和文档在视觉上看起来很吸引人;编写代码是向理性人自我记录的ly intelligent developer。感谢您提供详细的答案。如果没有更好的答案,我将在未来几天接受答案。您的答案完美地解释了一切。方法2对安全编程来说是危险的。方法1看起来不错,我会选择它,但我仍然会在内部和外部使用
    \u x
    使用
    newX
    作为函数参数。后续问题:您认为使用
    setXY(xx,yy)
    -加倍变量名怎么样?我刚刚提出了这个方案。或者
    setName(namename)
    。或者
    split(sizesize)
    。我想我更喜欢加倍变量名方案,而不是
    newX