使用 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 + ba * 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() 构造函数作为闭包的主要内容,如果未能解决你的问题,请参考以下文章

javascript设计模式与开发实践阅读笔记—— this,闭包与高阶函数

javascript闭包函数

拷贝构造函数详解

拷贝构造函数详解

闭包总结:闭包的7种形式

拷贝构造函数详解