Javascript 这两个函数定义具有不同的行为

Javascript 这两个函数定义具有不同的行为,javascript,function,Javascript,Function,有人能解释为什么这两个函数的行为不同吗 片段1: function operate1(operator) { return function(x, y) { return x + operator + y; } } function operate2(operator) { return new Function("x", "y", "return x " + operator + " y;"); } adder1 = operate1("+"); adder2 = op

有人能解释为什么这两个函数的行为不同吗

片段1:

function operate1(operator) {
  return function(x, y) {
    return x + operator + y;
  }
}
function operate2(operator) {
  return new Function("x", "y", "return x " + operator + " y;");
}
adder1 = operate1("+");
adder2 = operate2("+");

adder1(5, 3);    // returns "5+3"
adder2(5, 3);    // returns 8
片段2:

function operate1(operator) {
  return function(x, y) {
    return x + operator + y;
  }
}
function operate2(operator) {
  return new Function("x", "y", "return x " + operator + " y;");
}
adder1 = operate1("+");
adder2 = operate2("+");

adder1(5, 3);    // returns "5+3"
adder2(5, 3);    // returns 8
用法:

function operate1(operator) {
  return function(x, y) {
    return x + operator + y;
  }
}
function operate2(operator) {
  return new Function("x", "y", "return x " + operator + " y;");
}
adder1 = operate1("+");
adder2 = operate2("+");

adder1(5, 3);    // returns "5+3"
adder2(5, 3);    // returns 8

我特别好奇为什么
operate2
对算术表达式求值,而我认为它乍一看会作为字符串求值。这与它被定义为具有新运算符的函数对象有关吗?

由于运算符是字符串,因此第一个执行字符串连接

return x + "+" + y;
第二种方法对内容进行评估,因为这就是工作原理-结果类似于,但请查看此处的差异:

所以声明

new Function("x", "y", "return x " + operator + " y;");
是否对
“返回x”+运算符+“y;”
部件进行了评估

这是第二个版本,其行为与第一个版本类似

功能运算符2(运算符){
返回新函数(“x”、“y”、“返回x+'”+运算符+“'+y;”);
}
var adder2=运算符2(“+”);

警报(加法器2(5,3))
由于运算符是字符串,因此第一个执行字符串连接

return x + "+" + y;
第二种方法对内容进行评估,因为这就是工作原理-结果类似于,但请查看此处的差异:

所以声明

new Function("x", "y", "return x " + operator + " y;");
是否对
“返回x”+运算符+“y;”
部件进行了评估

这是第二个版本,其行为与第一个版本类似

功能运算符2(运算符){
返回新函数(“x”、“y”、“返回x+'”+运算符+“'+y;”);
}
var adder2=运算符2(“+”);

警报(adder2(5,3))
它遵循Mozilla站点上本文档中的确切描述:

构造函数签名:

new Function ([arg1[, arg2[, ...argN]],] functionBody)
functionBody
是一个字符串,包含构成函数定义的JavaScript语句


如果您确实希望
adder2
返回字符串,该怎么办?这样就可以了:下面是一些代码,用于构造生成表达式的代码

function operate2(operator) {
  return new Function("x", "y", "return '' + x + '" + operator + "' + y;");
}

以下是Mozilla站点上本文档中的确切描述:

构造函数签名:

new Function ([arg1[, arg2[, ...argN]],] functionBody)
functionBody
是一个字符串,包含构成函数定义的JavaScript语句


如果您确实希望
adder2
返回字符串,该怎么办?这样就可以了:下面是一些代码,用于构造生成表达式的代码

function operate2(operator) {
  return new Function("x", "y", "return '' + x + '" + operator + "' + y;");
}

因为
返回x+运算符+y
正在连接运算符,因为
返回x+运算符+y
连接运算符对第二个运算符不也是一样的吗?它的计算结果应该是“return x”+“+”+“+”+“y;”,其中“+”也是一个字符串。不,
new Function()
具有与eval几乎相同的功能。是否有文档支持它对上一个参数执行eval的语句?请查看我提供的链接。它没有执行求值,但字符串已求值。我更新了答案,将字符串版本包含在adder2中。第二个答案不也是一样的吗?它的计算结果应该是“return x”+“+”+“+”+“y;”,其中“+”也是一个字符串。不,
new Function()
具有与eval几乎相同的功能。是否有文档支持它对上一个参数执行eval的语句?请查看我提供的链接。它不执行求值,但字符串已求值。我更新了答案,将字符串版本包含在adder2@krato-请再试一次-我已经让它工作:@krato-请再试一次-我已经让它工作了: