在JavaScript中以字符串形式传递函数
如果这有点奇怪,我道歉 我有一个用Java编写的程序,它利用ScriptEngine处理用户提供的JavaScript来扩展我的应用程序。然而,这个特定的问题与通用JavaScript相关,而不是Java或其ScriptEngine,但我只是为了设置上下文来解释这个问题 我有一个函数,调用时返回一个字符串-我们将其称为在JavaScript中以字符串形式传递函数,java,javascript,prototype,Java,Javascript,Prototype,如果这有点奇怪,我道歉 我有一个用Java编写的程序,它利用ScriptEngine处理用户提供的JavaScript来扩展我的应用程序。然而,这个特定的问题与通用JavaScript相关,而不是Java或其ScriptEngine,但我只是为了设置上下文来解释这个问题 我有一个函数,调用时返回一个字符串-我们将其称为a(),定义如下: var a = function() { return "this is a"; }; 当用户使用a()调用此函数时,它工作正常并输出“this is a
a()
,定义如下:
var a = function() {
return "this is a";
};
当用户使用a()
调用此函数时,它工作正常并输出“this is a”。但是,如果用户忘记包含括号,那么它将输出我的实际函数定义——这是预期的,因为我不再调用该函数
为了抓住这一点,我将对象的toString
方法重新定义为:
a.toString = function() {
return a();
};
当我在字符串上下文中使用a
时,它可以隐式调用toString
方法,但是如果我试图将它传递给函数,那么它就不会调用toString
,剩下的是sun.org.mozilla.javascript.internal.internal.translationdfunction
我已经研究了另一个函数。prototype
方法(即apply
、bind
、constructor
等)尝试并重写方法,该方法被称为传递给另一个函数的函数,但它们都不符合要求。我基本上是在寻找一种方法,在不使用括号的情况下,将函数转换为字符串类型的对象,即a===a()
。对于可能会问我为什么不将a
定义为一个字符串开始的人,我的函数返回一个由用户提供的其他信息构造的字符串
也许解决方案是让我的用户编写语法正确的JavaScript,但我的用户远不是程序员。我还可以添加某种形式的预解析,用于检查缺少的括号,并在使用ScriptEngine执行之前动态添加它们。但是,尽管这两个选项都可以使用,但我正在寻找一种更简单的方法。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返回自定义动态字符串的选项是
defineGetter
,这是一个XY问题。您正在修复一个非问题。事实上,高阶函数是一个特性,而不是bug。“也许解决方案是让我的用户编写语法正确的JavaScript”。是的。“我还可以添加某种形式的预解析,检查缺少的括号,并在使用ScriptEngine执行它之前动态添加它们。”这也会起作用。甚至只是抛出一个错误而不是修复它。是的,我知道我不应该尝试破解JavaScript,因为我的用户不能使用正确的语法。文档是确保用户知道正确语法的关键。解决您的问题的一个干净的方法是创建您自己的语言,该语言将按照您和您的用户希望的方式工作。一开始听起来需要做很多工作,但考虑到大部分基础设施(解析器、字节码解释器等)已经存在,它实际上比修复javascript容易得多,最终会变得更加健壮和安全。我同意,并且我已经为我的用户创建了一种标记语言,为我的大多数应用程序做到了这一点。但是,我允许在我的标记语言中包含一些本地JavaScript。