Javascript функция организации - PullRequest
1 голос
/ 15 февраля 2010

Я не совсем уверен, в чем разница между словами "function x () {}" или "this.x = function () {}", но мне пришлось создать объектно-ориентированный JavaScript, который выглядит следующим образом:

function PROJECT(){
  ...
  ...
  ...
  this.main_call=function(...){ return this.recursive_call(...); }

  this.recursive_call=function(...){
    ...
    var local,variables;
    function helper(...,ref){
      ...
      ref.recursive_call(...);
    }
    ...
    helper(...,this);
    ...
  }
}
x=new PROJECT();
x.main_call(input);

Мой вопрос здесь заключается в том, является ли это хорошим стилем или есть какой-то способ, которым я могу вызвать вспомогательную функцию (которая используется для остановки дублирования одного и того же кода снова и снова), не передавая указатель «this». Я немного обеспокоен тем, что вспомогательная функция уже обращается ко всем локальным переменным в recursive_call, но выдает ошибки, если я пытаюсь получить доступ к this.recursive_call напрямую. Я также столкнулся с проблемами с переопределением переменных при попытке объявить this.helper = function (...) {...}.

Ответы [ 4 ]

0 голосов
/ 18 февраля 2010

Можете ли вы изменить его в цикл while / for? Рекурсию часто трудно читать и поддерживать (возможно, поэтому вам не нравится текущий код). Вы все еще можете иметь функцию helper (), вызываемую this.helper (), но решение повторить процесс лежит в логике цикла.

0 голосов
/ 15 февраля 2010

Оформить Обучение продвинутому JavaScript из Джон Ресиг .

  1. Если main_call только переносит recursive_call, это не нужно.
  2. Для вспомогательных функций рассмотрите возможность использования замыканий функций при создании функций, чтобы они не создавались для каждого вызова.
  3. Лично я предпочитаю использовать this в качестве помощника вместо передачи ref.

    this.recursive_call=(function(){
      ...
      function helper(...){
        ...
        this.recursive_call(...);
      }
      return function(...)
         ... 
         helper.call(this,...);
         ...
      };
    }).call(this);
    

Хотя он немного сложнее, он сохраняет this полезным, что мне кажется более интересным. Хотя вы всегда должны спрашивать себя, к каким объектам вам нужен доступ и где. Если не имеет смысла иметь this, это бесполезно, не используйте его. Revolution42 s ответ будет достаточно.

Вы могли бы также рассмотреть некоторые функциональные аспекты. Например, передайте вспомогательную функцию в recursive_call.

0 голосов
/ 17 февраля 2010

Чтобы узнать о function name () {} против var name = function () {}, я бы предложил прочитать этот связанный вопрос:

/ вопросы / 336859 / JavaScript-вар-имя_функции-функция-против-функции-FunctionName

0 голосов
/ 15 февраля 2010

Я не совсем понимаю, что вы пытаетесь сделать, но вы можете изменить свое замыкание. Как то так

function PROJECT(){

    this.main_call=function(){
    return recursive_call();
    }

    var local,variables;
    function helper()
    {
    recursive_call();
    }

    function recursive_call(){
    helper();
    }
}
x=new PROJECT();
x.main_call(input);

Если это не соответствует тому, что вам нужно, вы всегда можете изменить свою рекурсивную функцию на что-то вроде этого

this.recursive_call=function(...){
    ...
    var local,variables;
    var ref = this;
    function helper(...){
      ...
      ref.recursive_call(...);
    }
    ...
    helper(...);
    ...
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...