使用 Function() 构造函数作为闭包
Posted
技术标签:
【中文标题】使用 Function() 构造函数作为闭包【英文标题】:Using Function() constructor as a closure 【发布时间】:2021-12-30 23:38:14 【问题描述】:我正在尝试做这样的事情:
function simpleOperations(operation)
let myFanction = new Function('a', 'b', 'a ' + operation + ' b');
return myFanction
let sum = simpleOperations("+")
let multiplicate = simpleOperations("*")
console.log("your sum is: " + sum(3,7));
console.log("your product is: " + multiplicate(3,7));
而不是得到:
your sum is: 10
your product is: 21
我明白了:
your sum is: undefined
your product is: undefined
您对如何解决它有任何想法吗? :)
【问题讨论】:
你不见了return
。
可能有用:Are Variable Operators Possible? - 在表格中编码您的运算符,而不是动态构建函数。
函数体中缺少返回
【参考方案1】:
函数的正文需要return
的值,否则你的a + b
或a * b
等将只是一个未使用的表达式。
function simpleOperations(operation)
let myFanction = new Function('a', 'b', 'return a ' + operation + ' b');
return myFanction
let sum = simpleOperations("+")
let multiplicate = simpleOperations("*")
console.log("your sum is: " + sum(3,7));
console.log("your product is: " + multiplicate(3,7));
【讨论】:
【参考方案2】:使用Function
是一种反模式。它与eval
相差一个度数,而且总是有更好的编写方式,尤其是考虑到 javascript 已经支持一流的函数 -
const add = (a, b) => a + b
const multiply = (a, b) => a * b
console.log("your sum is: " + add(3,7))
console.log("your product is: " + multiply(3,7))
your sum is: 10
your product is: 21
如果您想使用 "+"
和 "*"
字符串访问函数,您可以创建一个简单的查找并在不支持特定操作时抛出错误 -
const operations =
"+": (a, b) => a + b,
"*": (a, b) => a * b
function simpleOperations(op)
const f = operations[op]
if (f == null)
throw Error(`unsupported operation: $op`)
return f
const add = simpleOperations("+")
const multiply = simpleOperations("*")
console.log("your sum is: " + add(3,7))
console.log("your product is: " + multiply(3,7))
const divide = simpleOperations("/") // <- not yet implemented
your sum is: 10
your product is: 21
Error: unsupported operation: /
实现一个简单的计算器是学习如何编写第一门编程语言的好方法。如果您对这类事情感兴趣,请查看related Q&A。
【讨论】:
以上是关于使用 Function() 构造函数作为闭包的主要内容,如果未能解决你的问题,请参考以下文章