Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中以字符串形式传递函数_Java_Javascript_Prototype - Fatal编程技术网

在JavaScript中以字符串形式传递函数

在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

如果这有点奇怪,我道歉

我有一个用Java编写的程序,它利用ScriptEngine处理用户提供的JavaScript来扩展我的应用程序。然而,这个特定的问题与通用JavaScript相关,而不是Java或其ScriptEngine,但我只是为了设置上下文来解释这个问题

我有一个函数,调用时返回一个字符串-我们将其称为
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。