Статические переменные в JavaScript

У Windows есть утилита в , а также планировщик задач Windows . Любой из них может запускать вашу программу с заданным интервалом.

664
задан Matt 20 January 2017 в 17:00
поделиться

12 ответов

Если вы пришли из объектно-ориентированного языка со статической типизацией на основе классов ( например, Java, C ++ или C #) Я предполагаю, что вы пытаетесь создать переменную или метод, связанный с «типом», но не с экземпляром.

Пример, использующий «классический» подход, с функциями конструктора, возможно, может помочь вам уловить концепции базового объектно-ориентированного 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 обрабатывает функции как в первую очередь - объекты класса , поэтому, будучи объектом, вы можете назначать свойства функции.

837
ответ дан 22 November 2019 в 21:42
поделиться

Обычно я использую этот метод по двум основным причинам:

, если я хочу сохранить локальные значения функций, я использую что-то вроде «Local.x», «Local.y», «Local.TempData» и т. Д.!

Если я хочу сохранить статические значения функций, я использую что-то вроде «Static.o», «Static.Info», «Static.count» и т. Д. ..!

[Update2]: тот же метод, но с использованием подхода IIFE!

[Update1]: объекты «Static» и «Local» для функций создаются автоматически с помощью предварительного редактирования сценариев!

0
ответ дан User 20 January 2017 в 17:00
поделиться

Я помню закрытия JavaScript, когда вижу это .. Вот как я это делаю ..

        function Increment() {
            var num = 0; // Here num is a private static variable
            return function () {
                return ++num;
            }
        }

        var inc = new Increment();
        console.log(inc());//Prints 1
        console.log(inc());//Prints 2
        console.log(inc());//Prints 3
-3
ответ дан Uthaiah 20 January 2017 в 17:00
поделиться

В JavaScript нет термина или ключевого слова static, но мы можем поместить такие данные непосредственно в объект функции (как в любом другом объекте).

function f() {
    f.count = ++f.count || 1 // f.count is undefined at first
    alert("Call No " + f.count)
}

f(); // Call No 1

f(); // Call No 2
1
ответ дан drneel 20 January 2017 в 17:00
поделиться

Следующий пример и объяснение взяты из книги Николаса Закаса «Профессиональный JavaScript для веб-разработчиков, 2-е издание». Это ответ, который я искал, поэтому я подумал, что было бы полезно добавить его сюда.

(function () {
    var name = '';
    Person = function (value) {
        name = value;
    };
    Person.prototype.getName = function () {
        return name;
    };
    Person.prototype.setName = function (value) {
        name = value;
    };
}());
var person1 = new Person('Nate');
console.log(person1.getName()); // Nate
person1.setName('James');
console.log(person1.getName()); // James
person1.name = 'Mark';
console.log(person1.name); // Mark
console.log(person1.getName()); // James
var person2 = new Person('Danielle');
console.log(person1.getName()); // Danielle
console.log(person2.getName()); // Danielle

Конструктор Person в этом примере имеет доступ к имени закрытой переменной, как и методы getName() и setName(). Используя этот шаблон, переменная имени становится статической и будет использоваться среди всех экземпляров. Это означает, что вызов setName() для одного экземпляра влияет на все остальные экземпляры. Вызов setName() или создание нового экземпляра Person устанавливает переменную name в новое значение. Это заставляет все экземпляры возвращать одно и то же значение.

16
ответ дан Benoit Garret 20 January 2017 в 17:00
поделиться

Есть другой подход, который решил мои требования после просмотра этой ветки. Это зависит от того, чего именно вы хотите достичь с помощью «статической переменной».

Глобальное свойство sessionStorage или localStorage позволяет хранить данные в течение жизни сеанса или в течение неопределенного более длительного периода, пока не будет явно очищено, соответственно. Это позволяет обмениваться данными между всеми окнами, фреймами, панелями вкладок, всплывающими окнами и т. Д. Вашей страницы / приложения и является гораздо более мощным, чем простая «статическая / глобальная переменная» в одном сегменте кода.

Это позволяет избежать хлопот, связанных с областью действия, временем жизни, семантикой, динамикой и т. Д. Глобальных переменных верхнего уровня, например Window.myglobal. Не знаю, насколько это эффективно, но это не важно для скромных объемов данных, доступ к которым осуществляется с умеренной скоростью.

Легко вызывается как «sessionStorage.mydata = что-нибудь» и извлекается аналогично. См. «JavaScript: Полное руководство, шестое издание», Дэвид Фланаган, ISBN: 978-0-596-80552-4, глава 20, раздел 20.1. Его легко загрузить в формате PDF с помощью простого поиска или в подписке на O'Reilly Safaribooks (на вес золота).

4
ответ дан Neeraj Kumar 20 January 2017 в 17:00
поделиться

В Javascript нет статической переменной. Этот язык объектно-ориентирован на основе прототипов, поэтому здесь нет классов, но есть прототипы, из которых объекты «копируют» себя.

Вы можете моделировать их с помощью глобальных переменных или с помощью прототипирования (добавление свойства к прототипу):

function circle(){
}
circle.prototype.pi=3.14159
0
ответ дан 22 November 2019 в 21:42
поделиться

Вары уровня окна вроде как статические в том смысле, что вы можете использовать прямую ссылку, и они доступны для всех частей вашего приложения

0
ответ дан 22 November 2019 в 21:42
поделиться

Вы можете воспользоваться тем фактом, что 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.

Который дает вам тот же результат - за исключением, на этот раз, увеличенное значение возвращается вместо отображения.

528
ответ дан 22 November 2019 в 21:42
поделиться

Самое близкое в JavaScript к статической переменной - глобальная переменная - это просто переменная, объявленная вне области действия функции или объекта. literal:

var thisIsGlobal = 1;

function foo() {
    var thisIsNot = 2;
}

Еще вы могли бы сохранить глобальные переменные внутри литерала объекта следующим образом:

var foo = { bar : 1 }

А затем получить доступ к таким переменным: foo.bar .

.
4
ответ дан 22 November 2019 в 21:42
поделиться

вы можете использовать arguments.callee для хранения «статических» переменных (это также полезно в анонимной функции):

function () {
  arguments.callee.myStaticVar = arguments.callee.myStaticVar || 1;
  arguments.callee.myStaticVar++;
  alert(arguments.callee.myStaticVar);
}
40
ответ дан 22 November 2019 в 21:42
поделиться

Я использовал прототип и тот способ, которым он работал:

class Cat extends Anima {
  constructor() {
    super(Cat.COLLECTION_NAME);
  }
}

Cat.COLLECTION_NAME = "cats";

или использование статического метода считывания:

class Cat extends Anima {
  constructor() {
    super(Cat.COLLECTION_NAME);
  }

  static get COLLECTION_NAME() {
    return "cats"
  }
}
0
ответ дан 22 November 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: