繁体   English   中英

必须将记忆功能定义为变量吗?

[英]Must memoized functions be defined as variables?

我刚刚问了这个问题( 当在另一个函数中进行函数精简时出现多个错误 ),我得到了一个不错的答案……但是! 为了了解更多有关JavaScript的知识,我想知道是否可以使用以下样式编写经过优化的功能:

function main () {
    function memoized_f(){
        //memoizing code
    }
}

编辑:请注意,我不是在问上面的代码有什么区别,我在问是否有可能记住第二个代码!

那么,如何重写呢?

function main() {
  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");
        value.innerHTML = "hello";
        console.log("new node");
        console.log("value: " + value);
        memo = value;
      }
      return value;
    }
    return f;
  })();
  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]);
  }
}
main();

您实际的记忆功能为f IIFE包装 (function(){ ... })()仅提供了一个附加的封闭层来隐藏变量memo以便仅对f可见。

重复一遍: (function(){...})()表达式不是您记住的函数。 它的包装限制了内部变量的可见性,并最终返回您在内部定义的记忆函数f 如果您可以将memo暴露给main其他代码并且不仅仅将其可见性限制于被备忘录的函数,则可以完全消除IIFE包装,而只需将f重命名为create_node

function main() {
    var memo;

    function create_node() {
      var value;
      if (memo) { value = memo.cloneNode(); }
      else {
        var value = document.createElement("div");
        value.innerHTML = "hello";
        memo = value;
      }
      return value;
    }

  // use `create_node` as originally done
  // NOTE that other code can manipulate `memo` now, though!
}
main();

如果愿意,可以通过函数声明而不是IIFE提供闭包:

function createMemoizedFunc() {
    var memo;

    function f() {
      var value;
      if (memo) { value = memo.cloneNode(); }
      else {
        var value = document.createElement("div");
        value.innerHTML = "hello";
        memo = value;
      }
      return value;
    }
    return f;
}
var create_node = createMemoizedFunc();

由于javascript中的函数是一个对象,因此您可以仅使用该函数来记住该值。 我认为在fib示例中会更有意义,但这是您的原始帖子。

 function main() { // memoizing function function create_node() { var value; // read from memo on function object if (create_node.memo) { value = create_node.memo.cloneNode(); value.innerHTML = 'cloned'; console.log("clone node"); console.log(value); } else { var value = document.createElement("div"); value.innerHTML = "hello"; console.log("new node"); console.log("value: " + value); // retain memo on the function object create_node.memo = value; } return value; } 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]); document.getElementById('container').appendChild(collection[i]); } } main(); 
 <div id="container"></div> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM