两个函数的Javascript回调
有没有办法用Javascript(ES6)实现下面的代码 如果是,我怎么做?我尝试了这个例子,但没有成功两个函数的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
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”)代码>这是一种使用已定义占位符作为符号来标识尚未设置的参数的方法
它具有一个此
对象,该对象绑定到调用函数以进行进一步检查和评估
如果andthis.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中的每个函数都提供了一个类似数组的对象,它包含实际函数的所有参数。正如您所说,调用序列是正确的,但是函数被调用了三次。它总是检查参数列表中是否没有占位符。如果是,则返回原始函数体求值。