两个函数的Javascript回调

两个函数的Javascript回调,javascript,ecmascript-6,callback,Javascript,Ecmascript 6,Callback,有没有办法用Javascript(ES6)实现下面的代码 如果是,我怎么做?我尝试了这个例子,但没有成功 const funcA = (callback, arg1) => { console.log("Print arg1: " + arg1); /* Print arg1: argument1 */ let x = 0; x = callback(x, ); return x; } const funcB = (x, prefix) => { console

有没有办法用Javascript(ES6)实现下面的代码

如果是,我怎么做?我尝试了这个例子,但没有成功

const funcA = (callback, arg1) => {
  console.log("Print arg1: " + arg1); /* Print arg1: argument1 */
  let x = 0;
  x = callback(x, );
  return x;
}

const funcB = (x, prefix) => {
  console.log("Print prefix: " + prefix); /* Print prefix: PREFIX_ */
  x = x + 1;
  return x;
}

/* Exec function funcA */
let x = funcA(funcB( ,"PREFIX_"), "argument1");
console.log("Value of x: " + x); /* Value of x: 1 */

部分应用程序在js中尚不可用。您需要另一个充当回调函数的arrow函数:

funcA(x => funcB(x ,"PREFIX_"), "argument1");
要称之为不需要额外的逗号:

x = callback(x)
Somewhen可能允许编写以下内容:

 funcA( funcB(?, "PREFIX_"), "argument1")

一种方法是为传递给
funcA
的第一个参数定义一个默认参数,并在调用
funcA
时使用
var
定义
x

const funcA=(回调,arg1)=>{
日志(“打印arg1:+arg1”);
设x=0;
x=回调(x,arg1);
返回x;
}
常量funcB=(x,前缀)=>{
console.log(“打印前缀:+前缀”);
x=x+1;
返回x;
}
/*执行函数funcA*/
var x=funcA(x=()=>funcB(x=0,“前缀”和“参数1”);

console.log(“x的值:+x”)这是一种使用已定义占位符作为符号来标识尚未设置的参数的方法

它具有一个
对象,该对象绑定到调用函数以进行进一步检查和评估

如果and
this.arg
的组合数组没有更多的
占位符
项,则使用参数调用函数并返回函数调用

否则,新的参数数组将绑定到函数并返回

[?]
表示占位符符号

 funcB    x    prefix       this.args        args       action
-------  ---  ---------  -------------  --------------  ------------------------------
1. call  [?]  "PREFIX_"                 [?], "PREFIX_"  return calling fn w/ bound args
2. call   0      [?]     [?], "PREFIX_"  0,  "PREFIX_"  return fn call with args
3. call   0   "PREFIX_"                                 return 1
(当然,它可以稍微短一点,并委托给另一个函数,但这是一个概念证明。)

函数funcA(回调,arg1){ console.log('funcA',回调,arg1) 返回回调(0,占位符); } 函数funcB(x,前缀){ var args=this&&this.args | |[], temp=Array.from(参数); console.log('funcB',isPlaceholder(x)'[?]':x,isPlaceholder(前缀)'[?]':前缀); //占位符部分 if(临时部分(iPlaceHolder)){ 每个参数的温度((a,i)=>isPlaceholder(a)和&i(args[i]=a)); 返回args.some(iPlaceHolder) ?函数绑定({args}) :funcB(…args); } //原点函数体 返回x+1; } 常数 占位符=符号(“占位符”), isPlaceholder=v=>v==占位符;
log(“x的值:+funcA(funcB(占位符,“前缀”;“argument1”)))您有空参数和前导逗号。你期望什么结果?我知道。但我的意思是空白和逗号是论点在不同的时间通过。部分应用-这就是我想知道的!我的例子说明了这一点。(请参阅已接受的答案)。@PedroGabrielLima将
x
定义为默认参数
funcA(x=()=>funcB(x=0,“前缀”;“参数1”)@guest271314我从控制台得到了这个错误,示例是:ReferenceError:在初始化之前无法访问词法声明'x'。很好地引用了这个建议+1@pedro很高兴提供帮助:)如果您在我的示例中看到,我没有将arg1作为参数传递给callback。这会有区别吗?@PedroGabrielLima为什么不传递
arg1
参数?这将如何改变预期结果?你想实现什么?这个例子不太清楚,但我在funcB中隔离参数的事实使代码模块化。在您的示例中,arg1是funcA的一部分,但我希望funcA是不可变的。这样,如果要将funcC而不是funcB传递给funcA,它将不依赖于变量arg1。我希望能清楚地了解这一点,呵呵。你的意思是说,在没有明确传递
arg1
的地方,
prefix
仍将在
funcB
中定义?也就是说,将设置一个默认值,默认值可以是相邻定义的参数?@PedroGabrielLima您可以在
funcN
中将
前缀设置为默认参数;e、 例如,
constfn=({x=0,prefix=“prefix”}={x:0,prefix:“prefix”})=>{console.log(x,prefix)};fn();fn({x:2})也很好看+1.你能解释一下你的例子吗?1.在funcB中,变量“arguments”从何而来?它是函数的默认参数?2.在输出中,它被打印为“funcB 0[?]”和“funcB 0 PREFIX_”,这意味着funcB被调用了两次。所以第一次调用在funcA中绑定funcB,第二次调用返回的funcB(…args)?3.对funcB的第一个调用是在“funcA(funcB(占位符,前缀“),“arguments”)”中进行的,第二个调用是在“return callback(0,占位符)”中进行的。Javascript中的每个函数都提供了一个类似数组的对象,它包含实际函数的所有参数。正如您所说,调用序列是正确的,但是函数被调用了三次。它总是检查
参数列表中是否没有占位符。如果是,则返回原始函数体求值。