У Windows есть утилита в , а также планировщик задач Windows . Любой из них может запускать вашу программу с заданным интервалом.
Если вы пришли из объектно-ориентированного языка со статической типизацией на основе классов ( например, 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 обрабатывает функции как в первую очередь - объекты класса , поэтому, будучи объектом, вы можете назначать свойства функции.
Обычно я использую этот метод по двум основным причинам:
, если я хочу сохранить локальные значения функций, я использую что-то вроде «Local.x», «Local.y», «Local.TempData» и т. Д.!
Если я хочу сохранить статические значения функций, я использую что-то вроде «Static.o», «Static.Info», «Static.count» и т. Д. ..!
[Update2]: тот же метод, но с использованием подхода IIFE!
[Update1]: объекты «Static» и «Local» для функций создаются автоматически с помощью предварительного редактирования сценариев!
Я помню закрытия 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
В 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
Следующий пример и объяснение взяты из книги Николаса Закаса «Профессиональный 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 в новое значение. Это заставляет все экземпляры возвращать одно и то же значение.
Есть другой подход, который решил мои требования после просмотра этой ветки. Это зависит от того, чего именно вы хотите достичь с помощью «статической переменной».
Глобальное свойство sessionStorage или localStorage позволяет хранить данные в течение жизни сеанса или в течение неопределенного более длительного периода, пока не будет явно очищено, соответственно. Это позволяет обмениваться данными между всеми окнами, фреймами, панелями вкладок, всплывающими окнами и т. Д. Вашей страницы / приложения и является гораздо более мощным, чем простая «статическая / глобальная переменная» в одном сегменте кода.
Это позволяет избежать хлопот, связанных с областью действия, временем жизни, семантикой, динамикой и т. Д. Глобальных переменных верхнего уровня, например Window.myglobal. Не знаю, насколько это эффективно, но это не важно для скромных объемов данных, доступ к которым осуществляется с умеренной скоростью.
Легко вызывается как «sessionStorage.mydata = что-нибудь» и извлекается аналогично. См. «JavaScript: Полное руководство, шестое издание», Дэвид Фланаган, ISBN: 978-0-596-80552-4, глава 20, раздел 20.1. Его легко загрузить в формате PDF с помощью простого поиска или в подписке на O'Reilly Safaribooks (на вес золота).
В Javascript нет статической переменной. Этот язык объектно-ориентирован на основе прототипов, поэтому здесь нет классов, но есть прототипы, из которых объекты «копируют» себя.
Вы можете моделировать их с помощью глобальных переменных или с помощью прототипирования (добавление свойства к прототипу):
function circle(){
}
circle.prototype.pi=3.14159
Вары уровня окна вроде как статические в том смысле, что вы можете использовать прямую ссылку, и они доступны для всех частей вашего приложения
Вы можете воспользоваться тем фактом, что 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.
Который дает вам тот же результат - за исключением, на этот раз, увеличенное значение возвращается вместо отображения.
Самое близкое в JavaScript к статической переменной - глобальная переменная - это просто переменная, объявленная вне области действия функции или объекта. literal:
var thisIsGlobal = 1;
function foo() {
var thisIsNot = 2;
}
Еще вы могли бы сохранить глобальные переменные внутри литерала объекта следующим образом:
var foo = { bar : 1 }
А затем получить доступ к таким переменным: foo.bar
.
вы можете использовать arguments.callee для хранения «статических» переменных (это также полезно в анонимной функции):
function () {
arguments.callee.myStaticVar = arguments.callee.myStaticVar || 1;
arguments.callee.myStaticVar++;
alert(arguments.callee.myStaticVar);
}
Я использовал прототип и тот способ, которым он работал:
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"
}
}