Преобразование строки в функцию в JavaScript - PullRequest
5 голосов
/ 25 ноября 2011

Я немного погуглил, но эта конкретная проблема слишком похожа на «как я могу оценить имена функций из строк», поэтому у меня возникают проблемы с поиском решения, я хочу преобразовать строку в функция, так сказать, у меня было что-то вроде:

for (var i = 0; i < someNumber ; i++) {
    var foo = "function() { someObject.someOtherFunctionCall(" + i + ") }";
    someArray[i] = foo;
}

как бы я набрал foo, чтобы я мог позвонить

someArray[0]();

Мне нужно, чтобы значение было включено в функцию, есть идеи?

РЕДАКТИРОВАТЬ: я просто заменил "значение" на "я" извинения за путаницу

UPDATE:

Хорошо, я принял icktoofay ответ, потому что он работает, чтобы ответить на большинство ваших вопросов и проблем; Я испробовал большинство предложенных методов, каждый из которых либо не передавал переменную в область вызывающих расположений, либо требовал замыкания, которые сохранялись со значением последней функции-функции, к сожалению, я не могу контролировать остальную часть кода, поэтому не могу внести изменения в местоположение, в котором функция в конце концов вызывается.

Это, вероятно, временное решение; Я знаю, насколько уродливые строки для разбора функций. Что касается совместимости с браузерами, это будет работать только в одной среде, поэтому я думаю, что мы в безопасности.

В любом случае, еще раз спасибо за быстрые ответы и обсуждение.

Ответы [ 5 ]

5 голосов
/ 25 ноября 2011

Если вам нужен массив функций, которые просто вызывают метод, это гораздо проще:

for(var i=0; i<someNumber; i++) {
    someArray.push(someObject.someOtherFunctionCall.bind(someObject, i));
}

Обратите внимание, что для этого требуется Function.bind, который может быть недоступенв старых браузерах.Если вам нужна поддержка старых браузеров, вы можете подшить или использовать эту версию:

for(var i=0; i<someNumber; i++) {
    someArray.push(function(i) {
        return function() {
            return someObject.someOtherFunctionCall(i);
        };
    }(i));
}

Редактировать: Вот старый ответ, который также должен работать, но менее элегантно:

for (var i = 0; i < someNumber ; i++) {
    var foo = new Function("someObject", "return function() { someObject.someOtherFunctionCall(" + value + ") }")(someObject);
    someArray[i] = foo;
}
2 голосов
/ 25 ноября 2011

Попробуйте:

var foo = function() { someObject.someOtherFunctionCall(value ) };
someArray[i] = foo; 

или

, если foo не является глобальной переменной, вы можете сделать это для передачи значения:

 var foo = (function(value) { return function() { someObject.someOtherFunctionCall(value ) } }) ( value );  
1 голос
/ 25 ноября 2011

Просто дайте ему свою сферу,

for (var i = 0; i < someNumber ; i++) {
    someArray[i] = (function(idx){
        return function() { someObject.someOtherFunctionCall(idx); };
    })(i)        
}
1 голос
/ 25 ноября 2011

Даже если вы работаете, это довольно небезопасно, если значение не очищено от ввода. Я бы просто использовал анонимную функцию (без строк), например:

var foo = function() { someObject.someOtherFunctionCall(value) };

Из-за области видимости в JS value будет доступен для foo в более позднее время, , если вы не измените значение после этой строки , тогда будет прочитано измененное value.

РЕДАКТИРОВАТЬ: Когда я внимательно посмотрел на вопрос, я понял, что это не работает. Пожалуйста, дайте мне немного времени, чтобы пересмотреть мой ответ.

ОБНОВЛЕНИЕ: Если вы действительно хотите это сделать, рассмотрите другие ответы.

(хотя боги JS будут плакать ...)

1 голос
/ 25 ноября 2011

вы можете использовать внутреннюю часть только в скобках и вызывать их через функцию eval().

вот описание: http://www.w3schools.com/jsref/jsref_eval.asp

вот пример:

for (var i = 0; i < someNumber ; i++) {
    var foo = "someObject.someOtherFunctionCall(" + value + ");";
    someArray[i] = foo;
}

eval(someArray[0]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...