Объявление функций в яваскрипт
От: dmitritch  
Дата: 12.07.19 09:00
Оценка:
Подскажите пожалуйста, вот это вот что за хитромудрое объявление функции такое:

const addSVGElementFromJson = this.addSVGElementFromJson = function (data) {


и что оно дает в сравнении с простым:

function addSVGElementFromJson(data) {
javascript newbie
Re: Объявление функций в яваскрипт
От: Mystic Artifact  
Дата: 12.07.19 09:34
Оценка:
Здравствуйте, dmitritch, Вы писали:

this.fnname — делает ее свойством объекта, видимо для доступа с наружи. const fnname — видимо, для доступа изнутри. Но, практика спорная, т.к. вызовы this.fnname() и fnname() не совсем эквивалентны, т.к. в зависимости от формы вызова this внутри будет разным.

С другой, стороны, если все таки знаешь, что делаешь — минификатор может переименовать const fnname в более короткое имя, да и сам вызов функции, очевидно не будет требовать property lookup, что только плюс.
Re: Объявление функций в яваскрипт
От: vsb Казахстан  
Дата: 12.07.19 09:40
Оценка:
Здравствуйте, dmitritch, Вы писали:

Если речь о
сonst addSVGElementFromJson = function (data) {


против

function addSVGElementFromJson(data) {


то отличия следующие:

1. Первый вариант не позволяет в последующем изменить значение addSVGElementFromJson. Во втором варианте можно в последующем изменить значение addSVGElementFromJson. Теоретически первый вариант может даже улучшить производительность, но как на самом деле — не знаю. На практике первый вариант более "устойчив" к опечаткам и ошибкам.

2. Видимость объявления. Первый вариант видим только после объявления. У второго варианта видимость распространяется на весь блок, в том числе и на участок до объявления. В частности во втором варианте это позволяет писать код в стиле top-to-bottom, когда вначале объявляется высокоуровневая функция, которая использует низкоуровневые, а после неё объявляются уже низкоуровневые и тд. Во первом варианте так не получится, придётся всегда объявлять функции в правильном порядке, начиная от низкоуровневых. Также не получится объявить две взаимно рекурсивные функции таким образом.

В целом современный JavaScript-код обычно пишется по первому варианту.
Отредактировано 12.07.2019 9:42 vsb . Предыдущая версия .
Re: Объявление функций в яваскрипт
От: GarryIV  
Дата: 12.07.19 10:04
Оценка:
Здравствуйте, 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);
WBR, Igor Evgrafov
Отредактировано 12.07.2019 10:14 GarryIV . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.