【问题标题】:Runtime error when executing simple closure in Javascript在 Javascript 中执行简单闭包时出现运行时错误
【发布时间】:2014-09-24 19:20:00
【问题描述】:

我是 JS 新手,正在努力学习。该规范需要以下内容: 编写一个函数,将另一个函数* 作为参数,并创建一个只能调用一次的函数版本。对修改后的函数的重复调用将无效,返回原始调用的值。如果不使用闭包,你怎么能做到这一点?甚至可能吗?你怎么能用闭包做到这一点? *注意:这个原始输入函数不应该有任何参数。

这就是我所拥有的:

var divide = function () {
var x = 2;
var y = 6;

return y/x;
}

var mainFunc = function (func) {
return func(){
    return y/x + 1;
}
}

var output = mainFunc(divide);
console.log(divide());
console.log(output());
console.log(output());

我在“return func(){”处收到“Unexpected token{”错误我不太明白我做错了什么?根据规范,我将 divide() 传递给 mainFunc() 并将其设置为参考变量输出。然后我多次调用 divide() 和 output() 来测试闭包是否有效并且修改后的函数只发生一次。我错过了什么或不理解什么?

感谢您的帮助。

【问题讨论】:

  • return func(){ //这是一个语法错误,这里{是意外的记号
  • 语法错误是怎么回事?我将divide()传递给mainFunc(),所以func()应该具有divide的属性,对吧?
  • 如果您确切地解释您想要实现的目标,也许会有所帮助。用文字,而不是代码。
  • 好吧,我想达到规范的要求——编写一个函数,将函数作为参数并创建一个只能调用一次的版本。原函数不应有任何参数。

标签: javascript closures higher-order-functions


【解决方案1】:

给你:

function runonce(func) {
  return (function(func) {
    var ran = false;
    var retval;
    return function() {
      if (!ran) {
        ran = true;
        retval = func();
      }
      return retval;
    }
  })(func);
}

function realfunction() {
  console.log('really running');
  return 5;
}

var realfunctionrunner = runonce(realfunction);
realfunctionrunner();
realfunctionrunner();
realfunctionrunner();

研究代码,整个技巧是一个“自包含库”,其结果是从 runonce 函数返回的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2014-07-31
    • 1970-01-01
    • 2017-02-28
    • 2016-08-29
    • 1970-01-01
    相关资源
    最近更新 更多