JavaScript - 调用之间函数中的持久数据?

问题描述:

我想用一个参数调用一个函数并存储该值,以便下一次我不使用参数调用该函数时,它将使用设置的最后一个参数。这是可能的JavaScript?JavaScript - 调用之间函数中的持久数据?

编辑:这里有更多的信息是什么我想实现...

var track = 0; 
$.getJSON('songsMetadata.json', function(data){ 
    appendData(data); 
}); 
player.bind("ended", function(){ 
    track++ 
    appendData(); 
}); 
function appendData(data){ 
    /* Here I want to populate 
    the inside 'data' argument 
    only once (in the callback of 
    getJSON) and use that same 
    data in the 'player.bind' 
    callback */ 

    //Some code to append data[track] to an HTML list 
} 
+0

是啊,肯定是可以做到的,但如果你能告诉我有更多的信息,我可以给你写一个例子。争论会是什么? –

+0

[Javascript:用状态创建一个函数]的可能重复(https://*.com/questions/8161671/javascript-creating-a-function-with-state) – Andreas

+0

你可能会感兴趣[迭代器和生成器]( https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Iterators_and_Generators) – BoltKey

你需要保持在封闭范围内的最后一个可以接受的参数的引用。例如:

var ref; 
 

 
function foo (arg) { 
 
    if (!arg) { // or arg === undefined if you want to be safe 
 
    arg = ref; 
 
    } else { 
 
    ref = arg; 
 
    } 
 

 
    // actual function behavior here 
 
    console.log(arg); 
 
} 
 

 
foo(); // undefined 
 
foo(2); // 2 
 
foo(); // 2 
 
foo(3); // 3 
 
foo(); // 3

如果你想重复这种行为,你可能要考虑写一个包装函数缓存一个接受函数的参数。例如:

function cacheFn (fn) { 
 
    var ref; 
 
    
 
    return function (arg) { 
 
    if (!arg) { 
 
     arg = ref; 
 
    } else { 
 
     ref = arg; 
 
    } 
 
    
 
    return fn(arg); 
 
    } 
 
} 
 

 
function foo (arg) { 
 
    console.log(arg); 
 
} 
 

 
var cachedFoo = cacheFn(foo); 
 

 
cachedFoo(2); 
 
cachedFoo(); 
 
cachedFoo(3); 
 
cachedFoo();

+0

我对这段代码有点困惑。你能解释一下正在做什么吗?例如,当你返回一个函数时会发生什么?为什么你将foo函数传递给cacheFn?我知道这段代码有效,但我真的很感兴趣,为什么 – medicengonzo

+1

@medicengonzo认为'cachedFn'作为一个附件,你可以对一个函数进行操作,以便它执行相同的功能,但带来额外的好处。我们做的第一件事是声明一个变量'ref',它将(内部)用于存储传递给函数的最新参数。然后我们返回一个函数来封装传入的函数(在你的案例中为'appendData')。这将最终运行你的函数,但首先我们做一些逻辑来确定已经通过了一个参数。如果是这样,我们直接传入这个参数并更新'ref',如果不是,我们传递'ref'。 – Damon

+1

这种模式的好处是你的函数,appendData或者你想要使用这个行为的任何其他函数对整个过程都是“哑”。它只能关注自己需要完成的逻辑。 – Damon

在更普遍的方式:

function enclose(func){ 
var args=[]; 
return function(...passed){ 
    args=passed.length?passed:args; 
    func(...args); 
}; 
} 

Usecases:

var log=enclose(console.log.bind(console)); 
log(5,1); 
log(); 
+1

对于'n' args这也是一个更一般的soln,假设es6可用。如果不能用'arguments'和'apply'轻松地复制传播行为。 +1 – Damon

+0

@damon +1为大致的想法;) –