[英]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.