Javascript';这';Z组合器和其他递归函数中的覆盖
背景: 如图所示,我有一个由Z-combinator实现的递归函数,因此它不使用Javascript';这';Z组合器和其他递归函数中的覆盖,javascript,recursion,this,anonymous-function,Javascript,Recursion,This,Anonymous Function,背景: 如图所示,我有一个由Z-combinator实现的递归函数,因此它不使用参数。被调用方,因为它在即将推出的ES6中将被弃用 问题 到目前为止,Z-combinator和所有递归匿名函数的主要问题是,它们将de这个值更新到内部函数范围(在return子句中自返回),因此引用顶层的这个会丢失,我想通过所有的内部功能来维护它 有没有一种方法可以维护顶级this,而不将其作为附加函数参数传递,这是解决此问题的最明显的方法,但没有我想要的那么干净 编辑: 现在,我通过将顶部的this引用传递给Z-
参数。被调用方
,因为它在即将推出的ES6中将被弃用
问题
到目前为止,Z-combinator和所有递归匿名函数的主要问题是,它们将de这个
值更新到内部函数范围(在return
子句中自返回),因此引用顶层的这个
会丢失,我想通过所有的内部功能来维护它
有没有一种方法可以维护顶级this
,而不将其作为附加函数参数传递,这是解决此问题的最明显的方法,但没有我想要的那么干净
编辑:
现在,我通过将顶部的this
引用传递给Z-combinator来解决这个问题,如下所示:
Co.Utilities.Z(this.createHTMLFromLOM)(this.LOM, this);
function createHTMLFromLOM(callee:any, LOM_section:LOM, self:any):void {
/* Some other code. */
return callee(LOM_section.children[widget], self);
}
在递归函数中,我通过如下方式传递top this值来返回相同的函数:
Co.Utilities.Z(this.createHTMLFromLOM)(this.LOM, this);
function createHTMLFromLOM(callee:any, LOM_section:LOM, self:any):void {
/* Some other code. */
return callee(LOM_section.children[widget], self);
}
这是我的Z-combinator定义:
function Z(func:any):any {
var f = function () {
return func.apply(null, [f].concat([].slice.apply(arguments)));
};
return f;
}
谢谢您可以执行以下操作:
var me=this代码>
然后通过me
作为Z组合器的参数。谢谢你的回答,你说的是我现在是如何做到这一点的。我将更新这个问题,指出这一点。你有其他的方法吗?你能发布一个精确的代码样本而不是Z组合模式的链接吗?这样调试代码会更容易。您可以尝试返回func.apply(null[f].concat([].slice.call(arguments,this))代码>但我不确定这是否会有帮助/起作用。那不起作用:(好吧,我会接受你的答案为正确,并投票表决,因为它与我做的一样,仅供参考。谢谢你的时间。很抱歉我帮不上忙。:S