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
}
你需要保持在封闭范围内的最后一个可以接受的参数的引用。例如:
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();
我对这段代码有点困惑。你能解释一下正在做什么吗?例如,当你返回一个函数时会发生什么?为什么你将foo函数传递给cacheFn?我知道这段代码有效,但我真的很感兴趣,为什么 – medicengonzo
@medicengonzo认为'cachedFn'作为一个附件,你可以对一个函数进行操作,以便它执行相同的功能,但带来额外的好处。我们做的第一件事是声明一个变量'ref',它将(内部)用于存储传递给函数的最新参数。然后我们返回一个函数来封装传入的函数(在你的案例中为'appendData')。这将最终运行你的函数,但首先我们做一些逻辑来确定已经通过了一个参数。如果是这样,我们直接传入这个参数并更新'ref',如果不是,我们传递'ref'。 – Damon
这种模式的好处是你的函数,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();
对于'n' args这也是一个更一般的soln,假设es6可用。如果不能用'arguments'和'apply'轻松地复制传播行为。 +1 – Damon
@damon +1为大致的想法;) –
是啊,肯定是可以做到的,但如果你能告诉我有更多的信息,我可以给你写一个例子。争论会是什么? –
[Javascript:用状态创建一个函数]的可能重复(https://stackoverflow.com/questions/8161671/javascript-creating-a-function-with-state) – Andreas
你可能会感兴趣[迭代器和生成器]( https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Iterators_and_Generators) – BoltKey