在另一个函数内部momoizing函数时出现多个错误

时间:2015-07-27 11:34:39

标签: javascript closures memoization

我有这样的事情:

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摇滚明星来启发我!

2 个答案:

答案 0 :(得分:3)

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

我在您的代码中看到了多个问题:

  • create_node函数没有返回。所以,你的收藏总是空的。
  • 您在f函数中定义了两个名称为“value”的变量。第二个var值可能是一个bug。
  • 永远不会分配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]); }
}

答案 1 :(得分:1)

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

git ls-files -co