// есть какая-то функция Person, которая возвращает свой контекст
// назовем эту функцию конструктором Person
/**
* возвращает объект
* @param {String} personName - имя, переданное в фунцию
* @returns {Object}
*/
function Person (personName) {
// инициализируем свойсво контекста name, полученным параметром
this.name = personName;
// сохраним ссылку на контекст этой функции в переменной,
// т.к. внутри другой функции будет другой контектс
var that = this;
// объявляем метод внутри контекста, который вернет нам name
this.getName = function getName () {
// здесь нам доступна переменная that за счет замыкания
return that.name;
};
// возвращаем контекст
return this;
}
var obj1 = Person('name1');
var obj2 = Person('name2');
console.log(obj1.getName()); // name2
console.log(obj2.getName()); // name2
var obj3 = new Person('name3');
var obj4 = new Person('name4');
console.log(obj3.getName()); // name3
console.log(obj4.getName()); // name4
SELECT
sensor_alerts.*,
sensor_instances.*,
json_build_object(
"city": groups.city
"address": groups.address
"country": groups.country
) as groups
FROM sensor_alerts
LEFT JOIN sensor_instances ON sensor_instances.id = sensor_alerts.sensorid
LEFT JOIN groups ON sensor_alerts.groupid = groups.parentid
We don't allow type annotations on catch clauses because there's really no way to know what type an exception will have. You can throw objects of any type and system generated exceptions (such as out of memory exception) can technically happen at any time.