Вы не можете прикрепить прослушиватели событий к отдельным переменным.
Лучший способ сделать это - поместить переменную в объект и сделать так, чтобы все пользователи этой переменной обращались к ней через методы «get» и «set»или более конкретно названные методы.При установке значения вы можете проверить, действительно ли значение изменяется так, как вас интересует, и действовать соответствующим образом.Вот пример:
var _isMenuReady = false; // do not access this directly
function isMenuReady() {
return(_isMenuReady);
}
function setMenuReady(val) {
if (arguments.length < 1) {
val = true;
}
if (!_isMenuReady && (val)) {
_isMenuReady = val;
// _isMenuReady has gone from false to true
// do whatever you need to do now
}
_isMenuReady = val;
}
// sample code
var ready = isMenuReady(); // returns whether the menu is ready or not
setMenuReady(); // sets the menu to be ready now
setMenuReady(false); // sets it back to not ready
Можно даже сделать его закрытым членом объекта, чтобы никто не мог получить к нему доступ непосредственно за пределами реальных методов доступа (хотя это не требуется, если весь код принадлежит вам ивы сотрудничаете, не обращаясь к переменной напрямую).Но, если вы хотите сделать его по-настоящему приватным, см. эту статью для получения информации о том, как сделать частных пользователей.По сути, вы создаете длительное закрытие функции, локальные переменные которого доступны только внутри функции.Это классная техника.
function menuReadyTracker(initialValue) {
var value = initialValue;
var subscribers = [];
this.get = function () {
return(value);
};
this.set = function(newVal) {
if (newVal != value) {
value = newVal;
var o;
for (var i = 0; i < subscribers.length; i++) {
o = subscribers[i];
o.func.call(o.ctx, o.data);
}
}
}
// call subscribe to register a notification callback
this.subscribe = function(f, data, ctx) {
var o = {};
o.func = f;
o.data = data;
o.ctx = ctx || window;
subscribers.push(o);
}
// call unsubscribe to remove a notification callback
this.unsubscribe = function(f, data, ctx) {
var o;
var newSubscribers = [];
for (var i = 0; i < subscribers.length; i++) {
o = subscribers[i];
if (o.func != f || o.data != data || o.ctx != ctx) {
newSubscribers.push(o); // copy if it doesn't match
}
}
subscribers = newSubscribers;
}
}
var menuReady = new menuReadyTracker(false);
menuReady.subscribe(myNotification, "in real-time.");
console.log(menuReady.get());
menuReady.set(true);
console.log(menuReady.get());
// this function gets called whenever the menu flag goes from false to true
// you can have as many subscribers to this notification as you want and
// they code that handles the notifications can be anywhere you want in your
// code base as the notification handlers are registered with the subscribe method
function myNotification(data) {
alert("I got notified " + data);
}
jsFiddle: http://jsfiddle.net/jfriend00/PYJef/