JavaScript中的静态变量

我如何在Javascript中创建静态变量?


如果您来自基于类的静态类型的面向对象语言(如Java,C ++或C#),我假设您正在尝试创建与“类型”关联的变量或方法,但不是针对实例。

使用“经典”方法和构造函数的例子可能可以帮助你理解基本的OO JavaScript的概念:

function MyClass () { // constructor function
  var privateVariable = "foo";  // Private variable 

  this.publicVariable = "bar";  // Public variable 

  this.privilegedMethod = function () {  // Public Method
    alert(privateVariable);
  };
}

// Instance method will be available to all instances but only load once in memory 
MyClass.prototype.publicMethod = function () {    
  alert(this.publicVariable);
};

// Static variable shared by all instances
MyClass.staticProperty = "baz";

var myInstance = new MyClass();

staticProperty属性在MyClass对象中定义(这是一个函数),并且与其创建的实例无关,JavaScript将函数视为一级对象,因此作为对象,可以将属性分配给函数。


您可能会利用JS功能也是对象这一事实 - 这意味着它们可以具有属性。

例如,引用Javascript中的静态变量(现在已消失)文章中给出的示例:

function countMyself() {
    // Check to see if the counter has been initialized
    if ( typeof countMyself.counter == 'undefined' ) {
        // It has not... perform the initialization
        countMyself.counter = 0;
    }

    // Do something stupid to indicate the value
    alert(++countMyself.counter);
}

如果您多次调用该函数,您会看到计数器正在增加。

这可能比使用全局变量对全局名称空间进行分配更好。


这里有另一种可能的解决方案,基于闭包:在javascript中使用静态变量的技巧:

var uniqueID = (function() {
   var id = 0; // This is the private persistent value
   // The outer function returns a nested function that has access
   // to the persistent value.  It is this nested function we're storing
   // in the variable uniqueID above.
   return function() { return id++; };  // Return and increment
})(); // Invoke the outer function after defining it.

这会得到相同的结果 - 除了这次,递增的值将返回,而不是显示。


你通过一个IIFE(立即调用的函数表达式)来完成它:

var incr = (function () {
    var i = 1;

    return function () {
        return i++;
    }
})();

incr(); // returns 1
incr(); // returns 2
链接地址: http://www.djcxy.com/p/76125.html

上一篇: Static variables in JavaScript

下一篇: Play! framework uses a <lot> of statics