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

These 2 function definitions have different behavior

本文关键字:定义 函数 两个      更新时间:2023-09-26

谁能解释一下为什么这两个函数的行为不同?

片段1:

function operate1(operator) {
  return function(x, y) {
    return x + operator + y;
  }
}

片段2:

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的工作方式——结果与eval类似,但看看这里的区别:eval()和new Function()是一样的吗?

语句

new Function("x", "y", "return x " + operator + " y;");

"return x " + operator + " y;"部分求值

这是第二个版本的行为与第一个

function operate2(operator) {
  return new Function("x", "y", "return x +'" + operator + "'+ y;");
}
var adder2 = operate2("+");
alert(adder2(5, 3))

与Mozilla网站上的文档描述完全一致:Function - JavaScript

构造函数签名:
new Function ([arg1[, arg2[, ...argN]],] functionBody)

functionBody是包含包含函数定义的JavaScript语句的字符串。


如果你真的想让adder2返回一个字符串呢?下面是一些代码,用来构造生成表达式的代码。

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