2014-11-06 5 views
0

Извинения, если это немного странно одно ...Передача функции в виде строки в 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. Однако, хотя оба этих варианта будут работать, я ищу более простой способ.

+3

Это проблема XY. Вы исправляете проблему без проблем. На самом деле функции более высокого порядка - это функция, а не ошибка. – elclanrs

+2

_ «Возможно, решение состоит в том, чтобы заставить моих пользователей писать синтаксически правильный JavaScript» _. Да. _ «Я также мог бы добавить некоторую форму предварительного анализа, которая проверяет отсутствие скобок и добавляет их динамически, прежде чем я ее выполню с помощью ScriptEngine». Это тоже сработает. Или просто забросил ошибку, а не исправил ее. – Cerbrus

+1

Да, я знаю, что я не должен пытаться взломать JavaScript, потому что мои пользователи не могут использовать правильный синтаксис. Документация является ключом к тому, чтобы пользователи знали правильный синтаксис. – chrixm

ответ

1

Ни a.toString, ни a.prototype.toString не позволит вам забыть скобки. .ToString позволяют сделать:

var a = function() { 
    return "this is a"; 
}; 

a.prototype.toString = function() { 
    return "something"; 
}; 

var A = new a; 
alert(A + ''); // something 

A.toString = function() { 
    return "something else"; 
}; 

alert(A + ''); // something else 

Вы не хотите в своем коде, как в() и возвращение то же самое, это выглядит как очень плохая идея.

Возможность получить myObject.myVar возвращать пользовательские динамическую строку является defineGetterhttps://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/defineGetter

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