Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.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 在将函数转换为字符串之前对函数中的变量求值_Javascript - Fatal编程技术网

Javascript 在将函数转换为字符串之前对函数中的变量求值

Javascript 在将函数转换为字符串之前对函数中的变量求值,javascript,Javascript,我正在使用PockDB查询数据库,它需要创建一个映射函数(这是couchDB的标准实践) 此版本正在运行: function (doc) { if (doc.type) { emit(doc.type) } }.toString() 其结果是: "function mapFunction(doc) { if (doc.type) { emit(doc.type); } }" 但是,我正在尝试将我的函数调用更改为更动态的,这样我就可以通过一个字段来传递map函数

我正在使用PockDB查询数据库,它需要创建一个映射函数(这是couchDB的标准实践)

此版本正在运行:

function (doc) {
  if (doc.type) {
    emit(doc.type)
  }
}.toString()
其结果是:

"function mapFunction(doc) {
  if (doc.type) {
    emit(doc.type);
  }
}"
但是,我正在尝试将我的函数调用更改为更动态的,这样我就可以通过一个字段来传递map函数应该基于的字段。考虑到这一点,我有一个名为
field
的变量,我将map函数更改为:

var field = '_id'
function (doc) {
  if (doc[field]) {
    emit(doc[field)
  }
}.toString()
问题是,生成的字符串如下所示:

"function mapFunction(doc) {
  if (doc[field]) {
    emit(doc[field]);
  }
}"
但我必须做到:

"function mapFunction(doc) {
  if (doc['_id']) { //or doc._id (I don't mind)
    emit(doc['_id']);
  }
}"
有可能做到这一点吗


编辑:更糟糕的情况是,我把它写成一个字符串,然后这样做,但我更希望它是一个可读的函数。

也许一个生成器可以接受一个函数、一个变量名和一个值并创建您想要的字符串

差不多

函数生成器(func、变量、值){
var r=新的RegExp(变量'gi');
返回函数toString().replace(r,值);
}
函数映射函数(doc){
如果(单据[字段]){
发出(文档[字段]);
}
}
var map=函数生成器(mapFunction,'field','U id';
控制台日志(map);

可能需要一个生成器,它接受一个函数、一个变量名和一个值,并创建您想要的字符串

差不多

函数生成器(func、变量、值){
var r=新的RegExp(变量'gi');
返回函数toString().replace(r,值);
}
函数映射函数(doc){
如果(单据[字段]){
发出(文档[字段]);
}
}
var map=函数生成器(mapFunction,'field','U id';
控制台日志(map);

我认为最简单的解决方案是一个简单的regexp

var字段='u id';
变量a=函数(doc){
如果(单据[字段]){
发出(文档[字段])
}
}.toString();

log(a.replace(/field/gi,field))我认为最简单的解决方案是一个简单的regexp

var字段='u id';
变量a=函数(doc){
如果(单据[字段]){
发出(文档[字段])
}
}.toString();

log(a.replace(/field/gi,field))正如我所评论的,这很广泛,因为您需要解析并重新生成这个字符串化函数。我不敢相信一个插件会强迫某人把一个函数字符串化

由于将
字段
替换为
\uu id
(由于其他标识符等原因)非常广泛,因此只能在字符串化函数中使用其初始值重新声明该
字段
(在顶部指定其值)

非相关建议: (提醒:
var
语句在整个范围内声明了一个变量,因此可以在
var
语句出现之前分配该变量。)


正如我所评论的,这很广泛,因为您需要解析并重新生成这个字符串化函数。我不敢相信一个插件会强迫某人把一个函数字符串化

由于将
字段
替换为
\uu id
(由于其他标识符等原因)非常广泛,因此只能在字符串化函数中使用其初始值重新声明该
字段
(在顶部指定其值)

非相关建议: (提醒:
var
语句在整个范围内声明了一个变量,因此可以在
var
语句出现之前分配该变量。)


您可以在函数原型上定义一个新方法,该方法执行
toString
,但允许以对象格式传递变量集合,其中每个键都是要使用的变量。这些变量被注入函数的字符串表示中,在函数体用大括号打开后立即作为
var
声明

每个变量都获得其原始值的JSON表示形式。当然,这有一些限制,因为并非所有的值都可以表示为JSON(循环引用、带方法的对象等等)。但它肯定适用于基本值,如字符串:

Function.prototype.toStringWith=函数(vars){
返回此.toString().replace(/(\)\s*{)/,
“$1\n变量”+对象.键(变量)
.map(key=>key+'='+JSON.stringify(vars[key]))
.join(',\n')+';');
}
//演示
变量字段=“\u id”
var s=函数映射函数(doc){
如果(单据[字段]){
发出(文档[字段])
}
}.toStringWith({field});//ES6快捷方式表示法

控制台日志;
您可以在函数原型上定义一个新方法,该方法执行
toString
,但允许以对象格式传递变量集合,其中每个键都是要使用的变量。这些变量被注入函数的字符串表示中,作为函数bod之后的
var
声明y以大括号打开

每个变量都获得其原始值的JSON表示形式。当然,这有一些限制,因为并非所有值都可以表示为JSON(循环引用、带方法的对象等)。但它肯定适用于原始值,如字符串:

Function.prototype.toStringWith=函数(vars){
返回此.toString().replace(/(\)\s*{)/,
“$1\n变量”+对象.键(变量)
.map(key=>key+'='+JSON.stringify(vars[key]))
.join(',\n')+';');
}
//演示
变量字段=“\u id”
var s=函数映射函数(doc){
如果(单据[字段]){
发出(文档[字段])
}
}.toStringWith({field});//ES6快捷方式表示法
console.log;
您可以执行以下操作:

"(function() {\n" +
    "var field = " + JSON.stringify(field) + ";\n" +
    "return " + mapFunction.toString() + ";" +
"})()"
警告:很少有
JSON.stringify
不能生成有效javascript的情况。我不知道这些情况到底是什么,也不知道恶意用户是否可能以某种方式利用它们。(你相信提供
字段值的人吗?)

你可以这样做:

"(function() {\n" +
    "var field = " + JSON.stringify(field) + ";\n" +
    "return " + mapFunction.toString() + ";" +
"})()"
警告:很少有情况下
JSON.stringify
不能生成有效的javascript.id
"(function() {\n" +
    "var field = " + JSON.stringify(field) + ";\n" +
    "return " + mapFunction.toString() + ";" +
"})()"