JavaScript 中的靜態變數

Harshit Jindal 2023年10月12日
  1. 在 JavaScript 中使用函式的屬性來建立靜態變數
  2. 在 JavaScript 中使用 IIFE(立即呼叫函式表示式)建立靜態變數
  3. 在 JavaScript 中使用 arguments.callee 建立靜態變數
  4. 在 JavaScript 中使用建構函式建立靜態變數
JavaScript 中的靜態變數

本教程介紹瞭如何在 JavaScript 中建立靜態變數。靜態變數是通常在函式中使用的變數,它們在函式呼叫之間保持其值。static 關鍵字有助於定義類的靜態屬性或方法。

在 JavaScript 中使用函式的屬性來建立靜態變數

JavaScript 中的函式是物件,可以具有屬性。因此,我們可以通過宣告函式的屬性來建立靜態變數。它們像全域性變數一樣保持其值,並且不能在函式外部進行修改,這使其比全域性變數更整潔。

function getId() {
  if (typeof getId.counter == 'undefined') {
    getId.counter = 0;
  }
  alert(++getId.counter);
}

多次呼叫上述函式會增加計數器的值,並且無法在函式外部訪問,如阻止所有混亂的全域性變數。

在 JavaScript 中使用 IIFE(立即呼叫函式表示式)建立靜態變數

IIFE 是在定義後立即執行的函式。它由兩部分組成:

  1. 匿名函式,其詞法範圍由分組運算子 () 包圍。
  2. 由 JavaScript 直接解釋的函式表示式。
var incr = (function() {
  var i = 1;
  return function() {
    return i++;
  }
})();
incr();  // returns 1
incr();  // returns 2

每呼叫一次函式,計數器 i 就增加一。i 在外部是無法訪問的,因為它是函式的屬性,就像類中典型的靜態變數一樣。

在 JavaScript 中使用 arguments.callee 建立靜態變數

我們可以使用 arguments.callee 在 JavaScript 中儲存靜態變數。它指的是當前正在執行的函式,我們可以像直接附加到函式物件一樣直接將屬性附加到該函式。

function() {
  arguments.callee.myStaticVar = arguments.callee.myStaticVar || 1;
  arguments.callee.myStaticVar++;
  alert(arguments.callee.myStaticVar);
}

此方法與方法 1 非常相似,唯一的區別是不是直接附加屬性,而是使用 arguments.callee 將屬性新增到當前執行的函式中。

在 JavaScript 中使用建構函式建立靜態變數

該方法是強型別的物件導向的語言(如 C++/Java/C++)的等效版本。我們嘗試將變數分配給整個型別,而不是所有例項。

function delftClass() {
  var privateVariable = 'foo';
  this.publicVariable = 'bar';
  this.privilegedMethod = function() {
    alert(privateVariable);
  };
}
delftClass.prototype.publicMethod = function() {
  alert(this.publicVariable);
};

delftClass.staticProperty = 'baz';
var myInstance = new delftClass();

在這裡,我們建立建構函式 delftClass,然後分配一個與建立的例項無關的靜態屬性。JavaScript 將函式視為物件,因此作為物件,我們可以為函式分配屬性。所有例項將共享靜態變數。

作者: Harshit Jindal
Harshit Jindal avatar Harshit Jindal avatar

Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.

LinkedIn

相關文章 - JavaScript Variable