Javascript 使一个函数返回子函数,但默认为另一个函数(Node.js/js)

Javascript 使一个函数返回子函数,但默认为另一个函数(Node.js/js),javascript,node.js,function,Javascript,Node.js,Function,我有一个函数,它当前返回一个包含子函数的对象 let myFunction=(数据)=>{ 返回{ a:函数(){ 返回一个() }, b:函数(){ 返回b() } } } 让a=()=>{ 返回“a” } 让b=()=>{ 返回“b” } console.log(myFunction().a()) //=>“a” console.log(myFunction())我想您是说希望myFunction返回一个函数,该函数返回字母表,但也包含a和b函数 您可以这样做,因为函数是对象,对象可以具有

我有一个函数,它当前返回一个包含子函数的对象

let myFunction=(数据)=>{
返回{
a:函数(){
返回一个()
},
b:函数(){
返回b()
}
}
}
让a=()=>{
返回“a”
}
让b=()=>{
返回“b”
}
console.log(myFunction().a())
//=>“a”

console.log(myFunction())
我想您是说希望
myFunction
返回一个函数,该函数返回字母表,但也包含
a
b
函数

您可以这样做,因为函数是对象,对象可以具有任意属性。函数和属性没有文字语法,但您可以通过赋值或使用
对象轻松添加它们。赋值

let myFunction=(data)=>Object.assign(
()=>“abcdefghijklmnopqrstuvxyz”,
{a,b}
);
让a=()=>{
返回“a”;
};
让b=()=>{
返回“b”;
};
log(myFunction().a());
//=>“a”
log(myFunction()());
//                      ^^−−−−−−−−−−− 注意额外的()

//=>“abcdefghijklmnopqrstuvwxyz”
我想你是说你想要
myFunction
返回一个函数,该函数返回字母表,但也包含
a
b
函数

您可以这样做,因为函数是对象,对象可以具有任意属性。函数和属性没有文字语法,但您可以通过赋值或使用
对象轻松添加它们。赋值

let myFunction=(data)=>Object.assign(
()=>“abcdefghijklmnopqrstuvxyz”,
{a,b}
);
让a=()=>{
返回“a”;
};
让b=()=>{
返回“b”;
};
log(myFunction().a());
//=>“a”
log(myFunction()());
//                      ^^−−−−−−−−−−− 注意额外的()
//=>“abcdefghijklmnopqrstuvxyz”
编辑

读了你的评论,我想我现在明白了,但我担心你的要求是不可能的。在某种程度上,您的意思是:“如果调用后的代码取消引用该对象,我希望我的函数返回一个对象”。分成语法等价的几行,你说

let iWantAnObject = myFunction()
iWantAnObject.a() // => 'a'  it works!

let iWantAFunction = myFunction() // same invocation of myFunction, here, it needs to know about the next line of code
iWantAFunction() // oh no, I can't invoke an object :-(
我唯一的想法就是向myFunction传递一个param,让它知道你想要什么,让它知道你打算用它返回的内容做什么

原创…

另一种方法是返回由参数选择的函数,而不是对象

let myFunction=(数据)=>{
常量函数={
a:函数(){
返回“a”
},
b:函数(){
返回“b”
}
}
const allLettersFn=()=>“abcdefg…”
返回数据?莱特函数[数据]:Alllettsfn;
}
设fnB=myFunction('b')
设fnAll=myFunction()
控制台日志(fnB)
console.log(fnB())
console.log(fnAll)
console.log(fnAll())
编辑

读了你的评论,我想我现在明白了,但我担心你的要求是不可能的。在某种程度上,您的意思是:“如果调用后的代码取消引用该对象,我希望我的函数返回一个对象”。分成语法等价的几行,你说

let iWantAnObject = myFunction()
iWantAnObject.a() // => 'a'  it works!

let iWantAFunction = myFunction() // same invocation of myFunction, here, it needs to know about the next line of code
iWantAFunction() // oh no, I can't invoke an object :-(
我唯一的想法就是向myFunction传递一个param,让它知道你想要什么,让它知道你打算用它返回的内容做什么

原创…

另一种方法是返回由参数选择的函数,而不是对象

let myFunction=(数据)=>{
常量函数={
a:函数(){
返回“a”
},
b:函数(){
返回“b”
}
}
const allLettersFn=()=>“abcdefg…”
返回数据?莱特函数[数据]:Alllettsfn;
}
设fnB=myFunction('b')
设fnAll=myFunction()
控制台日志(fnB)
console.log(fnB())
console.log(fnAll)

console.log(fnAll())
我正在努力理解您所寻找的最终结果。特别是,您的第二个代码片段(虽然没有按照您所说的那样工作)将
{a:[函数a],b:[函数b]}
显示为调用
myFunction()
..所需的(?)输出。我正在努力理解您所寻找的最终结果。特别是,您的第二个代码片段(虽然没有按照您所说的那样工作)显示了
{a:[函数a],b:[函数b]}
,作为调用
myFunction()
..所需的(?)输出。我认为OP要求(并且您正在提供)比需要的更高级别的间接寻址。我认为OP可能希望向myFunction传递一个参数,并让它返回任何生成字母的函数(而不是对象)。默认值(无参数)将导致整个字母表函数。@danh-是的,很难说。@T.J.Crowder,谢谢您的回答!我想这是我能找到的最接近我的解决方案。如果我可以返回该值,并且不调用额外的
()
(例如,myFunction()而不是myFunction()),我更愿意这样做。这可能吗?Thanks@danh是的,这正是我想要的。当你指定你想要的子函数时,你会得到返回的字母(
myFunction().a()
=>
'a'
),但是当你调用
myFunction()时
你得到了
abcdefghijklmnopqrstuvwxyz
回来(
myFunction()
=>
'abcdefghijklmnopqrstuvwxyz'
也许正如我所回答的那样,@imaginate?尽管TJCrowder的这篇文章对这个问题的回答也是一个非常合理的解释。我认为OP是在要求的(你正在提供)比所需的更高级别的间接寻址。我认为OP可能希望向myFunction传递一个参数,并让它返回任何生成字母的函数(不是对象)。默认值——无参数——将生成整个字母表函数。@danh-是的,很难说。