var f = function() { var names = {} addGlobalListener = function(name, f) { if(!names.hasOwnProperty(name)){ names[name] = {} } if(!names[name].hasOwnProperty("listeners")){ names[name]["listeners"] = [] } names[name]["listeners"].push(f) } getGlobal = function(name) { return names[name]["val"] } setGlobal = function(name, value) { if(!names.hasOwnProperty(name)){ names[name] = {"val": undefined} } var oldValue = names[name]["val"] names[name]["val"] = value if(names[name].hasOwnProperty("listeners")){ for(var i in names[name]["listeners"]){ names[name]["listeners"][i](oldValue, value) } } } } f(); setGlobal("myName", "Кеша"); // Потом такой: addGlobalListener("myName", function (oldValue, newValue) { console.log("Ваше имя было изменено. Раньше оно было: " + oldValue + ", теперь оно стало: " + newValue); }); addGlobalListener("myName", function () { console.log("Здравствуйте, " + getGlobal("myName")); }); // // Потом я делаю так: setGlobal("myName", "Вера"); getGlobal("myName")