【问题标题】:multiple errors while momoizing function inside another function在另一个函数中momoizing函数时出现多个错误
【发布时间】:2015-07-27 11:34:39
【问题描述】:

我有这样的事情:

function main() {
  function create_node() {
    console.log("create_node")
      (function() {
        var memo;
        console.log(memo);

        function f() {
          var value;
          console.log(value);

          if (memo) {
            value = memo.cloneNode();
            console.log("clone node");
            console.log(value);
          } else {
            var value = document.createElement("div");
            var style = "";
            value.setAttribute("style", style);
            value.innerHTML = "hello";
            console.log("new node");
            console.log(value);
          }
          return value;
        }
        return f;
      })();
  }
  var colection = [];
  for (var i = 0; i < 10; i++) {
    colection.push(create_node());
  };
}
main();

问题是我在尝试记录“create_node”时遇到错误(至少在 Firefox 中)。另外,如果我不返回 f(),而不是 f,它就不会被执行。在任何情况下,备忘录总是未定义的。所以我这里有这三个问题。我猜他们来自对复杂闭包缺乏了解,所以我需要一个 Javascript 摇滚明星来启发我!

【问题讨论】:

    标签: javascript closures memoization


    【解决方案1】:

    由于无法发表评论,我必须发表回复。

    我在您的代码中发现了多个问题:

    • create_node 函数没有返回值。因此,您的收藏将永远是空的。
    • 您在f 函数中定义了两个名为“value”的变量。第二个 var 值可能是一个错误。
    • 永远不会分配 var memo。
    • 当您在匿名函数中返回 f 时,您并未执行它。

    我猜你正在尝试做这样的事情:

    function main() {
      var memo;   
      function create_node() {
        console.log("create_node");
        memo = (function() {
          console.log("memo:" + memo);
          function f() {
            var value;
            console.log("value:" + value);
    
            if (memo) {
              value = memo.cloneNode();
              console.log("clone node" + value);
            } else {
              value = document.createElement("div");
              var style = "";
              value.setAttribute("style", style);
              value.innerHTML = "hello";
              console.log("new node:" + value.innerHTML);
            }
            return value;
          }
          return f;
    
        })()();
       return memo
      }
      var collection = [];
      for (var i = 0; i < 10; i++) {
        collection.push(create_node());
      };
      // Display results
      for(var i = 0; i<10;i++) { console.log(i + ". " + collection[i]); }
    }
    

    【讨论】:

    • 您的 cmets 是正确的,但您的解决方案不可能正确。例如,您将 memo 放在应该被 memoized 的函数之外
    • 我用正确的答案编辑了你的代码。我这样做是因为你的线索帮助我弄清楚了。
    • (…)()() - 你是认真的吗?
    • @Bergi 你是什么意思你是认真的吗?你能为我们经验不足的人详细说明一下吗?
    • @AndreaCasaccia:我的意思是,将两个 IIFE 相互嵌套几乎没有意义
    【解决方案2】:

    我找到了自己问题的答案:

    var create_node = (function() {
        var memo;
        console.log("memo: "+memo);
        console.log("create_node")
        function f () {
            var value;
            if(memo){
                value = memo.cloneNode();
                console.log("clone node");
                console.log(value);
            }else{
                var value = document.createElement("div");
                memo = value;
            }
            console.log("new node");
            console.log("value: "+value);
            return value;
        }
        return f;
    })();
    

    【讨论】:

      猜你喜欢
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      相关资源
      最近更新 更多