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

时间:2015-07-14 09:30:39

标签: javascript function

有人可以解释为什么这两个函数的行为不同。

代码段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评估算术表达式时,我认为它会在初看时将其评估为字符串。这是否与使用new运算符定义为函数对象有关?

2 个答案:

答案 0 :(得分:3)

由于运算符是字符串

,第一个进行字符串连接
return x + "+" + y;

第二个对内容进行评估,因为这是new Function的工作方式 - 结果与eval类似,但请看一下这里的差异:Are eval() and new Function() the same thing?

所以声明

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))




答案 1 :(得分:1)

它遵循Mozilla网站上本文档中的确切描述:Function - JavaScript

构造函数签名:

new Function ([arg1[, arg2[, ...argN]],] functionBody)

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

如果您确实希望adder2返回字符串,该怎么办?这样做:这是一些构造生成表达式的代码的代码。

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