Javascript 这两个函数定义具有不同的行为
有人能解释为什么这两个函数的行为不同吗 片段1: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
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-请再试一次-我已经让它工作了: