once
コールバックを入力として受け入れ、関数を返す関数を書きたいのですが。返された関数が初めて呼び出されたとき、コールバックを呼び出してその出力を返す必要があります。それがさらに呼び出された場合、コールバックを再度呼び出す代わりに、最初に呼び出されたときの出力値を返します。
以下は私がやろうとしたことです。しかし、期待した結果が得られません。この概念を理解する必要があります。
function once(func) {
let num;
function retFunc(x){
num = func(x);
return num;
}
return retFunc;
}
function addByTwo(input){
return input + 2;
}
var onceFunc = once(addByTwo);
console.log(onceFunc(4)); //should log 6
console.log(onceFunc(10)); //should log 6
console.log(onceFunc(9001)); //should log 6
あなただけ割り当てる必要があるnum = func(x)
ときnum
であるundefined
-の非常に最初の呼び出しで、ですretFunc
。
function once(func) {
let num;
function retFunc(x){
if (num === undefined) {
num = func(x);
}
return num;
}
return retFunc;
}
function addByTwo(input){
return input + 2;
}
var onceFunc = once(addByTwo);
console.log(onceFunc(4)); //should log 6
console.log(onceFunc(10)); //should log 6
console.log(onceFunc(9001)); //should log 6
どのような場合は渡された関数( -しかし、これは保証され、一般的な解決策ではありませんaddByTwo
あなたの例では)結果にundefined
呼び出されたとき?その後、=== undefined
チェックは機能しません。したがって、フラグなどを設定し、コールバックが最初に呼び出されたときにそのフラグを再割り当てすることをお勧めします。
function once(func) {
let num;
let done = false;
function retFunc(x){
if (!done) {
done = true;
num = func(x);
}
return num;
}
return retFunc;
}
function returnsUndefinedOn1(input){
return input === 1 ? undefined : input;
}
var onceFunc = once(returnsUndefinedOn1);
console.log(onceFunc(1));
console.log(onceFunc(10));
console.log(onceFunc(9001));
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加