有人可以解释为什么这两个函数的行为不同。
代码段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运算符定义为函数对象有关?
答案 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;");
}