这两个函数定义具有不同的行为
These 2 function definitions have different behavior
谁能解释一下为什么这两个函数的行为不同?
片段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;");
}
相关文章:
- 用嵌套函数和默认函数定义函数
- 自定义函数中的光标位置
- Jquery未定义函数正在停止其他操作
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- javascript无法重新定义函数内部的全局对象
- 定义函数时,如何捕获外部变量的当前值
- 能够在定义函数表达式之前使用它
- Google Sheet自定义函数返回0
- Javascript-defineProperty和直接在对象上定义函数之间的区别
- 其中是自定义函数中的属性
- 创建自定义函数以在函数上运行完整的多选下拉列表
- Google Sheets自定义函数条件格式
- 为什么当我需要位于顶部的函数时,在脚本中的某些点上没有定义函数
- 使用变量的名称,然后为该变量定义函数
- dalek回调或自定义函数
- 如何在angular ui模态控制器中定义函数
- Uncaught ReferenceError:尝试在Android网络视图中访问时未定义函数
- UI网格:如何从自定义函数访问MODEL_COL_FIELD
- 在构造函数中定义函数会比将其附加到原型消耗更多的内存
- 使用 Javascript 中的函数重新定义函数