Динамический вызов функции для функции класса, используя settimeout - PullRequest
1 голос
/ 21 июня 2011


У меня есть классоподобная структура в javascript, я пытаюсь вызвать функцию-брат, используя переданное имя функции.
Это сложно объяснить, поэтому позвольте мне показать вам пример того, что я пытаюсь выполнить.

function windowFactory(){
    this.init = function(functionName,args[]){
        SetTimeout(functionName(args),2000)
    }
    this.func1 = function(var1){
        alert(var1);
    }
    this.func2 = function(var1, var2){
        alert(var1+var2);
    }
}
var win1 = new windowFactory();
win1.init("func1","hello");
var win2 = new windowFactory();
win2.init("func2","world","!");

Обратите внимание, что это только демонстрационная функция, включая синтаксические ошибки / опечатки.
Теперь у меня была эта работа с использованием страшного Eval, когда он был за пределами класса ...

eval(funcName+"('"+darray[1]+"','"+darray[2]+"')");

Просто требовалось, чтобы он был вне класса и передавал фиктивные значения для параметров

1 Ответ

1 голос
/ 21 июня 2011

Примерно так и должно быть:

var windowFactory = function() {
  var self = this;
  this.init = function(functionName){
      var args = Array.prototype.slice.call(arguments, 1);
      setTimeout(function() {
          self[functionName].apply(self, args);
      }, 2000);
  };
  this.func1 = function(var1){
      alert(var1);
  };
  this.func2 = function(var1, var2){
      alert(var1+var2);
  };
};
var win1 = new windowFactory();
win1.init("func1","hello");
var win2 = new windowFactory();
win2.init("func2","world","!");

Обратите внимание на пользовательскую ссылку на себя var self = this;.Это используется потому, что когда вызывается функция тайм-аута, объект this будет иметь значение window (по крайней мере, в веб-браузере).

Еще одно уточнение: обратиться к определенному свойству объекта в JavaScriptсделать следующим образом:

object.property; // Or
object['property']; // When you have a string literal, like in your example
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...