Arhn - архитектура программирования

Объем функции объекта

factory(n) возвращает объекты с функциями. func1 определение функции создает свою собственную область видимости, а x внутри этой функции ссылается на x = n + ''. Но func2 - это ссылка, и область действия неверна.

Есть ли способ вернуть объект из create, чтобы его функции были ссылками (а не отдельными определениями)?

На самом деле, я согласен с подходом func1, в то время как площадь определения функции невелика. Если это сложная функция, было бы лучше не клонировать эту функцию в каждый объект, поступающий из factory(n). inner_func нельзя использовать this, это простая функция. Также я хочу избежать new и this.

var factory = (function(){
  var x = '!';

  return function create(n){
    var x = n + '';
    return {
      func1: function(y){return inner_func(x, y); },
      /* vs */
      func2: inner_func_api
    }
  }

  function inner_func_api(y){ return inner_func(x, y); }

  function inner_func(a, b){ return a + b; }

}());

var f1 = factory(2);
var f2 = factory(3);

var f1_func1 = f1.func1(4);
var f2_func1 = f2.func1(5);

var f1_func2 = f1.func2(4);
var f2_func2 = f2.func2(5);

console.log(f1_func1, f2_func1); //24 35
console.log(f1_func2, f2_func2); //!4 !5

  • использование новых и прототипов — встроенный способ сделать это. Я знаю, Крокфорду это не нравится. Но это языковой механизм, позволяющий делать то, что вы пытаетесь сделать. Ваш подход func2 хорош и использует ссылки как функции. 27.02.2016
  • Я не совсем уверен, что вы спрашиваете. Вам либо нужно замыкание для захвата состояния, либо вам нужно передать параметры. В зависимости от того, что вы на самом деле делаете, вы можете использовать частичное приложение и избежать дублирования целой функции, но вам все равно нужно будет получить нужное состояние либо через замыкания, либо через параметры. Как говорит t3dodson, отказ от new и this эффективно устраняет большую часть возможностей ООП JS — какой смысл отказываться от того, что дает вам JS? 27.02.2016
  • Может быть, это было слишком строго. Я хочу добавить, что this, prototype, bind, call внутри func1, func2, inner_func_api в порядке. Что касается ООП, я хочу свести к минимуму управление состояниями. Вам не кажется, что код выглядит красиво без this и new :), да и попроще. Как я уже сказал, решение делает свою работу; Я просто хотел немного улучшить и думал, что мне чего-то не хватает для этого. 27.02.2016

Ответы:


1

Вы можете определить эту функцию отдельно от инициализатора объекта в операторе return:

var factory = (function(){
  var x = '!';

  return function create(n){
    var x = n + '';

    function func1(y) {
      return inner_func(x, y);
    }

    return {
      func1: func1,
      /* vs */
      func2: inner_func_api
    }
  }

  function inner_func_api(y){ return inner_func(x, y); }

  function inner_func(a, b){ return a + b; }

}());

Однако это не имеет практического значения, и не имеет значения, насколько велика или сложна эта функция. Экземпляры функций занимают место, но код функции является постоянным (неизменяемым) и не обязательно должен быть частью каждого объекта Function, созданного из одного и того же фрагмента исходного кода.

27.02.2016
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..