2013-03-11 4 views
1

Я строю библиотеку JavaScript с другом, который, как предполагается сделать создание игры HTML5 проще (но это на самом деле просто для удовольствия), и вот какой-то код у меня возникают проблемы с:Javascript обычай применять функцию

/* Calls f on all the elems of the list that pass p and implement f */ 
    var apply = function (f, p, list) { 
     for (var i in list) { 
      if (p(list[i]) === true && list[i][f] != undefined && typeof list[i][f] === 'function') { 
       list[i][f](); 
      } 
     } 
    }; 
    this.draw = function(p) { 
     apply(moveView, p, this.views); 
    }; 

Пользователь будет вызывать функцию this.draw и передавать ему предикат. Функция moveView, которая передается в функцию apply, будет выполняться только в том случае, если каждый объект в массиве представлений реализовал ее.

Однако моя консоль ошибочно говорит, что «moveView не определен», что имеет смысл, потому что. В тот момент, когда я вызываю свою функцию приложения, я не хочу, чтобы интерпретатор проверял, существует ли moveView или нет, я просто хочу передать его, чтобы я мог проверить, использует ли каждый объект, к которому применяется, реализует эту функцию. Я думал, что, может быть, вызов применяется как apply("draw", p, this.views);, но это не так, потому что тогда в функции apply функция f больше не является функцией, это строка. Я просто хочу иметь возможность передать любое общее имя функции в мою функцию приложения, чтобы затем я мог выполнить все проверки внутри.

Весь мой код можно найти на моем Github.

EDIT:

/*View object*/ 
var View = (function(){ 
    var constr = function(f, o, i){ 
     this.frame = utility.checkFrame(f); 
     this.orient = utility.checkOrientation(o); 
     /*user identification string*/ 
     this.id = i; 
     this.moveView = function(){ 
       console.log("testing"); 
     }; 
    }; 
return constr; 
}()); 
+0

Предполагая, что 'this.views' - ​​это список объектов' View', тогда 'apply (" moveView ", p, this.views)' должно работать нормально. –

ответ

0

Я понял. Это было на моем месте. Объект:

var View = (function(){ 
this.moveView = function(){ 
      console.log("testing"); 
    }; 
var constr = function(f, o, i){ 
    this.frame = utility.checkFrame(f); 
    this.orient = utility.checkOrientation(o); 
    /*user identification string*/ 
    this.id = i; 

}; 
return constr; 
}()); 

Я переместил moveView вне конструктора объекта View, и ошибка больше не была выбрана. Это вопрос масштаба.

+0

То, что ошибка не выбрасывается, не означает, что вы решили проблему. Ваше «решение» присваивает 'moveView'' window', т. Е. Вы делаете его глобальной переменной/функцией. Конечно, это может быть то, что вы хотели, но для меня это немного странно. –

+0

Да, я знаю, я закончил с вашим ответом о передаче в строку. Если вы хотите выразить это как ответ, я с радостью соглашусь с этим. – barndog

0

Если функция не существует, когда apply() называется также не существует на объектах, что ваша проверка функции против.

Кроме того, если ваш параметр функции f, list[i].f не оценивается в list[i].yourFunction. Это всегда будет list[i].f. Вам нужно проверить на list[i][f].

+0

Хорошо, я исправлю это. Но как мне передать общее имя функции, не проверяя, существует ли эта функция? Я хочу, чтобы пользователь передавал имя функции независимо от существования, и вся проверка будет выполняться внутри функции apply. – barndog

+0

Если вы хотите, чтобы ваш пользователь передавал функцию ** имя **, здесь вы имеете дело со строкой. Вы просто не можете передать переменную, которая не определена. Это не имеет никакого смысла. – Amberlamps

+0

Да, это то, что сказал @ Феликс Клинг. И сюрприз! Он работает: D – barndog

Смежные вопросы