2016-08-07 3 views
2

Я определил свою собственную версию partial функции:Частичная прикладная функция работает только в первый раз.

const partial = function (fn,...partialArgs){ 
    let args = partialArgs; 
    return function(...fullArguments) { 
    let arg = 0; 
    for (let i = 0; i < args.length && arg < fullArguments.length; i++) { 
     if (args[i] === undefined) { 
     args[i] = fullArguments[arg++]; 
     } 
     } 
     return fn.apply(null, args); 
    }; 
}; 

и когда я использую его:

let delay = partial(setTimeout,undefined,100) 
delay(() => console.log("XXX")) 

он печатает XXX, как я ожидал. Но когда я пытаюсь повторно использовать функцию delay, кажется, что он не работает:

delay(() => console.log("YYY")) 

даже выше фрагмент кода печатает XXX !! Я не знаю, где я делаю ошибку.

+0

ли ваше намерение имеют 'partial' заменяют' undefined' аргументы в 'partialArgs' на те из' fullArguments'? Это очень необычная форма частичного применения, но я вижу примеры использования ... –

+0

@ T.J.Crowder: Да, именно это я и пытался! –

ответ

3

Проблема в том, что вы изменитеargs, который вы сохраняете при вызове функции; последующие вызовы повторно используют модифицированные аргументы, потому что вы заполняете только те, которые имеют undefined.

Если это намеренное (заполнение отверстий), то вам необходимо сделать копию partialArgs каждый раз перед изменением копии см *** комментариев:

const partial = function(fn, ...partialArgs) { 
 
    // *** Not creating `args` here 
 
    return function(...fullArguments) { 
 
    let arg = 0; 
 
    let args = partialArgs.slice(); // *** Make a copy here before modifying 
 
    for (let i = 0; i < args.length && arg < fullArguments.length; i++) { 
 
     if (args[i] === undefined) { 
 
     args[i] = fullArguments[arg++]; 
 
     } 
 
    } 
 
    return fn.apply(null, args); 
 
    }; 
 
}; 
 

 
let delay = partial(setTimeout, undefined, 100) 
 

 
delay(() => console.log("XXX")) 
 

 
delay(() => console.log("YYY"))

+0

Оператор LGTM, __if__ может быть упрощен 'args [i] = args [i] || fullArguments [arg ++]; ' –

+0

My bad! Я попытался переместить 'args' внутри функции возврата. Но совершенно забыл, что использует оригинальную ссылку! –

Смежные вопросы