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