Извинения, если это немного странно одно ...Передача функции в виде строки в JavaScript
У меня есть программа, написанная на Java, которая использует ScriptEngine для обработки при условии JavaScript, чтобы продлить мое приложение пользователя. Однако этот конкретный вопрос связан с общим JavaScript, в отличие от Java или его ScriptEngine, но я просто объясняю это, чтобы установить контекст.
У меня есть функция, которая возвращает строку при вызове - давайте назовем его a()
, как определено ниже:
var a = function() {
return "this is a";
};
Когда пользователь вызывает эту функцию с помощью a()
она отлично работает и выводит «это». Однако, если пользователь забывает включать скобки, то он выводит мое фактическое определение функции - ожидая этого, поскольку я больше не вызываю функцию.
Чтобы поймать этого я пересмотрел toString
метод моего объекта к следующему:
a.toString = function() {
return a();
};
Это прекрасно работает, когда я использую a
в строковом контексте, как он вызывает метод toString
неявно, но если я попытаюсь чтобы передать его функции, то он не вызывает toString
, и я остаюсь с sun.org.mozilla.javascript.internal.InterpretedFunction
.
Я смотрел на других Function.prototype
методов (т.е. apply
, bind
, constructor
, и т.д.), чтобы попытаться переопределить метод, который называется функция передается в другую функцию, но ни один из них не соответствовал требованиям. Я в основном ищу способ преобразования функции в объект типа строки всякий раз, когда он используется без скобок - i.e a === a()
. Для людей, которые могут спросить, почему я не определяю a
как строку для начала, моя функция возвращает строку, построенную из другой информации, предоставленной пользователем.
Возможно, решение состоит в том, чтобы заставить моих пользователей писать синтаксически правильный JavaScript, но мои пользователи далеки от программистов. Я мог бы также добавить некоторую форму предварительного анализа, которая проверяет отсутствующую скобку и динамически добавляет ее, прежде чем я ее выполню с помощью ScriptEngine. Однако, хотя оба этих варианта будут работать, я ищу более простой способ.
Это проблема XY. Вы исправляете проблему без проблем. На самом деле функции более высокого порядка - это функция, а не ошибка. – elclanrs
_ «Возможно, решение состоит в том, чтобы заставить моих пользователей писать синтаксически правильный JavaScript» _. Да. _ «Я также мог бы добавить некоторую форму предварительного анализа, которая проверяет отсутствие скобок и добавляет их динамически, прежде чем я ее выполню с помощью ScriptEngine». Это тоже сработает. Или просто забросил ошибку, а не исправил ее. – Cerbrus
Да, я знаю, что я не должен пытаться взломать JavaScript, потому что мои пользователи не могут использовать правильный синтаксис. Документация является ключом к тому, чтобы пользователи знали правильный синтаксис. – chrixm