在javascript中,在函数包装器中维护范围时遇到问题

时间:2011-07-14 11:43:27

标签: javascript html5 scope

外部/内部函数重复多次。除了内部函数调用外,外部函数总是相同的,例如e.target.ffunc1()

util.func1 = function( e, successFunc, failureFunc ) {
  e.target.ffunc1( function( err ) {
    if( !err && successFunc )       successFunc();
    else if( err && failureFunc )   failureFunc();
    else if( err )                  nonblockAlert( err );
  } );
}
HTMLInputElement.prototype.ffunc1 = function( nextFunc ) {  ... }

util.func2 = func...
HTMLInputElement.prototype.ffunc2 = func...

...

尝试编写一个糖包装器,以便在定义这些外部函数时使用。

尝试了显而易见的事实:

util.wrapper = function( e, callFunc, successFunc, failureFunc ) {
        callFunc( function( err ) {
                if( !err && successFunc )       successFunc();
                else if( err && failureFunc )   failureFunc();
                else if( err )                  nonblockAlert( err );
        } );
}
util.func1 = function( e, successFunc, failureFunc ) {
  util.wrapper( e. e.target.ffunc1, successFunc, failureFunc );
}

但由于this中的ffunc1不是e.target,而是func1正在响应的事件,因此失败了。回想起来,这很有道理。

如何编写保留e.target.ffunc1调用范围(?)的包装函数,也就是说,执行ffunc1时,this为{{1}来自外部e.target函数。

(免责声明:我承认很多人因为很好的理由不会使dom元素超载,我尊重这个位置。但是,


解决方案,正如每个人(但我)似乎都知道的那样,是func1

util.wrapperDB = function( e, callFunc, successFunc, failureFunc ) {
        callFunc.call( e.target, function( err ) {
                if( !err && successFunc )       successFunc();
                else if( err && failureFunc )   failureFunc();
                else if( err )                  nonblockAlert( err );
        } );
}

2 个答案:

答案 0 :(得分:1)

您是否尝试在函数对象上使用call()方法?即。

func.call( [this argument], arg1, arg2, ...);

在您的代码中:

callFunc.call( e.target, function( err ) {
            if( !err && successFunc )       successFunc();
            else if( err && failureFunc )   failureFunc();
            else if( err )                  nonblockAlert( err );
    } );

答案 1 :(得分:0)

可能有用的一件事是JavaScript的call方法,它允许您传递您希望this在被调用函数中的内容。示例:e.target.ffunc1.call(e.target)

我上班时会更新更多细节。

更新:看起来马丁打败了我。很高兴你得到它的工作!