簡體   English   中英

如何在JavaScript中對私有變量使用與函數自變量相同的名稱? (使代碼看起來更好)

[英]How to use the same name for private variables in JavaScript as for function arguments? (to make code look nicer)

我今天寫了這段代碼:

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行上使用xy作為私有變量。

我的問題是:對於私有變量和函數自變量,我的代碼中到處都有xy嗎? 我將如何分配xxyy線5和6,這樣是否可行?

setXY ,函數參數xy 遮蓋Point函數主體中定義的局部變量xy

在javascript中,沒有直接的方法可以訪問陰影變量。 通過聲明參數名稱以隱藏局部變量,可以使局部變量不可訪問。

通常,在這種情況下,javascript開發人員不會嘗試訪問陰影變量,而是會執行以下兩項操作之一:

  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 ); 

這兩種方法之間的主要區別在於

  1. 由於他們是局部變量, _x_y是從定義的外部訪問Point ,所以他們不能除了通過更新setXY

  2. 由於它們是對象成員,因此引用this對象的任何人都可以訪問this.xthis.y ,並且可以在Point定義之外進行修改,而無需使用setXY 繼續前面的代碼:

     console.log( px, py ); // prints 5, 7 px = 11; console.log( px, py ); // 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;
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM