最后一个语法是如何工作的?谁能帮我分解一下?
考虑switchcase 和switchcaseF 的定义。
const switchcase = cases => defaultCase => key =>
cases.hasOwnProperty(key) ? cases[key] : defaultCase
const switchcaseF = cases => defaultCase => key =>
switchcase(cases)(defaultCase)(key)()
如果我们将switchcase 的应用程序内联到switchaseF 中,我们会得到以下结果。
const switchcaseF = cases => defaultCase => key =>
(cases.hasOwnProperty(key) ? cases[key] : defaultCase)()
//|____________________________________________________|
// |
// switchcase(cases)(defaultCase)(key)
此外,我们可以在条件表达式中移动函数应用程序。
const switchcaseF = cases => defaultCase => key =>
cases.hasOwnProperty(key) ? cases[key]() : defaultCase()
现在,考虑您链接到的 article 中的示例。
const counter = (state = 0, action) =>
switchcaseF({
'INCREMENT': () => state + 1,
'DECREMENT': () => state - 1
})(() => state)(action.type)
如果我们将switchcaseF 的应用程序内联到counter 中,我们会得到以下结果。
const counter = (state = 0, action) => {
const cases = {
'INCREMENT': () => state + 1,
'DECREMENT': () => state - 1
}
const defaultCase = () => state
const key = action.type
return cases.hasOwnProperty(key) ? cases[key]() : defaultCase()
}
因此,如果action.type 是'INCREMENT',那么结果是state + 1。如果action.type 是'DECREMENT',那么结果是state - 1。否则,结果为state。
我们写像() => state + 1 这样的表达式而不是简单的state + 1 的原因是为了lazy evaluation。我们只在调用函数时评估() => state + 1 的主体。这可以防止出现以下示例中的错误行为。
const switchcase = cases => defaultCase => key =>
cases.hasOwnProperty(key) ? cases[key] : defaultCase
const never = () => { while (true); }
const example = key => switchcase({
never: never()
})('it works')(key)
console.log(example('it should work')) // expected 'it works' but never returns
使用switchcaseF 可以解决这个问题。
const switchcaseF = cases => defaultCase => key =>
cases.hasOwnProperty(key) ? cases[key]() : defaultCase()
const never = () => { while (true); }
const example = key => switchcaseF({
never: () => never()
})(() => 'it works')(key)
console.log(example('it should work')) // 'it works' as expected
但是,请注意,您也可以使用 getter 使其与 switchcase 一起使用。
const switchcase = cases => defaultCase => key =>
cases.hasOwnProperty(key) ? cases[key] : defaultCase
const never = () => { while (true); }
const example = key => switchcase({
get never() { return never(); }
})('it works')(key)
console.log(example('it should work')) // 'it works' as expected
我们也可以让defaultCase变得懒惰。
const switchcase2 = cases => defaultCase => key =>
cases.hasOwnProperty(key) ? cases[key] : defaultCase.value
const never = () => { while (true); }
const example = key => switchcase2({
get never() { return never(); }
})({ get value() { console.log('yes'); return 'it works'; } })(key)
console.log(example('it should work')) // 'yes' 'it works' as expected
如果你不想让它变得懒惰,那么你可以将它包装在strict 中,如下所示。
const switchcase2 = cases => defaultCase => key =>
cases.hasOwnProperty(key) ? cases[key] : defaultCase.value
const never = () => { while (true); }
const strict = value => ({ value })
const example = key => switchcase2({
get never() { return never(); }
})(strict('it works'))(key)
console.log(example('it should work')) // 'it works' as expected
希望能解开你的疑惑。