Подскажите пожалуйста, вот это вот что за хитромудрое объявление функции такое:
const addSVGElementFromJson = this.addSVGElementFromJson = function (data) {
и что оно дает в сравнении с простым:
function addSVGElementFromJson(data) {
Здравствуйте, dmitritch, Вы писали:
Если речь о
сonst addSVGElementFromJson = function (data) {
против
function addSVGElementFromJson(data) {
то отличия следующие:
1. Первый вариант не позволяет в последующем изменить значение addSVGElementFromJson. Во втором варианте можно в последующем изменить значение addSVGElementFromJson. Теоретически первый вариант может даже улучшить производительность, но как на самом деле — не знаю. На практике первый вариант более "устойчив" к опечаткам и ошибкам.
2. Видимость объявления. Первый вариант видим только после объявления. У второго варианта видимость распространяется на весь блок, в том числе и на участок до объявления. В частности во втором варианте это позволяет писать код в стиле top-to-bottom, когда вначале объявляется высокоуровневая функция, которая использует низкоуровневые, а после неё объявляются уже низкоуровневые и тд. Во первом варианте так не получится, придётся всегда объявлять функции в правильном порядке, начиная от низкоуровневых. Также не получится объявить две взаимно рекурсивные функции таким образом.
В целом современный JavaScript-код обычно пишется по первому варианту.
Здравствуйте, dmitritch, Вы писали:
D>Подскажите пожалуйста, вот это вот что за хитромудрое объявление функции такое:
D>D>const addSVGElementFromJson = this.addSVGElementFromJson = function (data) {
D>
D>и что оно дает в сравнении с простым:
D>D>function addSVGElementFromJson(data) {
D>
Это обычно делалось для кода типа
function Ctor() {
const elements = [];
// function addSVGElementFromJson(data) { не будет доступна снаружи
const addSVGElementFromJson = this.addSVGElementFromJson = function (data) {
elements.push(data);
console.info(`elements.length=${elements.length}`);
}
this.anotherFunction = function () {
// this.addSVGElementFromJson({svg:1}); работать не будет
addSVGElementFromJson({svg:1});
}
}
obj = new Ctor();
obj.addSVGElementFromJson({svg:2});
setTimeout(obj.anotherFunction, 10);
это аналогично (с поправкой не видимость о которой писал vsb).
function Ctor() {
const elements = [];
function addSVGElementFromJson (data) {
elements.push(data);
console.info(`elements.length=${elements.length}`);
}
this.addSVGElementFromJson = addSVGElementFromJson;
this.anotherFunction = function () {
addSVGElementFromJson({svg:1});
}
}
const obj = new Ctor();
obj.addSVGElementFromJson({svg:2});
setTimeout(obj.anotherFunction, 10);