【问题标题】:Using Function() constructor as a closure使用 Function() 构造函数作为闭包
【发布时间】: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? - 在表格中编码您的运算符,而不是动态构建函数。
  • 函数体中缺少返回

标签: javascript function closures


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-02
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      相关资源
      最近更新 更多