javascript - 我如何阅读这个多参数函数
问题描述
如何阅读和解释函数的以下行:
const canUser = (permission) => (permissions) => (guideSlug) => {
这是完整的功能:
const canUser = (permission) => (permissions) => (guideSlug) => {
if (!permissions) return false;
const globalPermissions = permissions['*'] || {};
const guidePermissions = permissions[guideSlug] || {};
return globalPermissions[permission] || guidePermissions[permission] || false;
};
编辑
如果我有这样的对象:
export const checks = {
canInvite: canUser('invite'),
}
我正在导入canInvite
我的组件,然后运行该函数,给它一个guideSlug
(字符串)来运行该函数。它可以工作并检查出来,我只是不完全确定如何从const canUser
函数定义中理解它的作用
这里的任何澄清都会有所帮助。谢谢!
解决方案
const foo = function(x) { return x + 1 }
可以粗略地写为const foo = x => x + 1
. 后者称为箭头函数
所以
const canUser = (permission) => (permissions) => (guideSlug) => {
if (!permissions) return false;
const globalPermissions = permissions['*'] || {};
const guidePermissions = permissions[guideSlug] || {};
return globalPermissions[permission] || guidePermissions[permission] || false;
};
和
const canUser = function(permission) {
return function(permissions) {
return function (guideSlug) {
if (!permissions) return false;
const globalPermissions = permissions['*'] || {};
const guidePermissions = permissions[guideSlug] || {};
return globalPermissions[permission] || guidePermissions[permission] || false;
}
}
};
这称为partial application或currying,两者有点相同我不确定这里的准确术语是什么。
这是一个有用的案例......
const foo = (x, y) => { /* something to be done with x and y */ }
let x = foo(a,b);
let y = foo(a,c);
let z = foo(a,d);
在这里,您可以看到代码中有很多a
s 有点重复且可读性较差。用下面的方式写就可以解决问题了...
const foo = x => y => { /* something to be done with x and y */ }
let fooA = foo(a); // fooA is the `y => {}` function with `x = a` "partially applied"
let x = fooA(b);
let y = fooA(c);
let z = foo(a)(d); // you can still write it like this
这种模式的另一个优点是你可以传递fooA
给其他函数,或者如果你想将它存储在一个抽象a
的.const somethingRelevantToA = { foo: foo(a), bar: "some other prop of
" }
此外,如果您想要类似的东西fooA
并且fooB
它们有一些共同点,例如......
const foo = x => y => {
/* piece of code independent of x (this is being reused) */
/* piece of code dependent only on y or x and y both */
}
因此,基本上,您不是在单独编写,而是在编写fooA
并因此重用逻辑。fooB
foo
推荐阅读
- python - 通过 Selenium 进行 Web 抓取时遇到“列表索引超出范围”异常
- html - 溢出y滚动菜单上没有滚动条
- maven - 如何使用本地 maven 存储库创建容器映像而不是谷歌云的中央 maven 存储库
- nativescript - Youtube 视频扩展图标在 webview 中默认禁用,适用于 android 平台和 ipad 的 nativescript-angular
- node.js - 将文件写入节点js中的特定文件夹?
- ssas - 如何使用 SSAS 获得最后一个度量甚至是空的,具体取决于维度
- google-bigquery - 管道无法放入 BigQuery Sink MapReduce 程序“阶段 1”失败
- javascript - Twilio 语音通话只能使用一次 [麦克风权限问题]
- sap-cloud-sdk - VDM 调用以获取具有 0 到 1 的多重性的导航属性,为 0 响应提供 NullPointerException
- java - 嵌入式数据库项目