MyException - 我的异常网
当前位置:我的异常网» Java Web开发 » 麻雀虽小,五脏俱全:研究一下JavaScript的函数回调

麻雀虽小,五脏俱全:研究一下JavaScript的函数回调机制,该如何处理(2)

www.MyException.Cn  网友分享于:2013-03-10  浏览:15次


测试以上代码,我们可以发现,通过Closure和通过显示指定对象得到的效果一致。

7、模拟更加真实的调用情景
但是以上代码还有一个问题,通常在真实环境中,如果回调函数是对象中方法,那么发起请求的方法也处在同一个对象,
在javascript中,this也可以代表当前对象,但不能直接用在匿名function中用,比如:
JScript code
var testObj={        
    context:"初始",
    callback:function (str){//回调函数
        alert("callback:我所处的上下文中,context="+this.context+",我被回调的方式:"+str);
    },
    caller:function(){
        callWithClosure(function(param){this.callback(param);});
    }
};//创建一个对象,作为测试回调函数的上下文


以上代码中的this指的不是testObj,而是全局上下文,
需要在closure外写一个临时变量来代表this,完整的代码如下:
JScript code
<html>
<head>
<script>    
    var context="全局";
    var testObj={        
        context:"初始",
        callback:function (str){//回调函数
            alert("callback:我所处的上下文中,context="+this.context+",我被回调的方式:"+str);
        },
        caller:function(){            
            callWithClosure(function(param){this.callback(param);});
            var temp=this;
            callWithClosure(function(param){temp.callback(param);});            
        }  
    };//创建一个对象,作为测试回调函数的上下文
    testObj.context="已设置";
    
    function testCall(){                    
        callMethod(testObj.callback);
        testObj.caller();
        callWithClosure(function(param){testObj.callback(param);});
        callObjMethod(testObj,testObj.callback);        
    }  
    function callObjMethod(obj,method){        
        method.call(obj,"指定显式对象上下文回调");
    }
    function callMethod(method){        
        method("通过默认上下文回调");        
    }
    function callWithClosure(method){        
        method("通过Closure保持上下文回调");        
    }
    
    function callback(str){
        alert("callback:我是定义在外部的全局函数。");
    }
</script>
</head>
<body>
<a href="javascript:void(0)" onclick="testCall()">调用测试</a>
</body>
</html>


8、什么是Closure
Two one sentence summaries: 
a closure is the local variables for a function - kept alive after the function has returned, 
or 
a closure is a stack-frame which is not deallocated when the function returns. (as if a 'stack-frame' were malloc'ed instead of being on the stack!) 

详情参见:http://blog.morrisjohns.com/javascript_closures_for_dummies





------解决方案--------------------
JScript code
var testObj={
        that:this,
        context:"初始",
        callback:function (str){//回调函数
            alert("callback:我所处的上下文中,context="+that.context+",我被回调的方式:"+str);
        }        
    };

------解决方案--------------------
JavaScript 中的 this 对象是可变的,随着绑定对象的不同而发生变化,不像 Java 中的 this 是不可变对象。

var me = this; 这种方式在闭包函数中很常用,借由一个变量来引用当前的对象,在闭包中仍然可以获得上一上下文中的 this 对象,
而不是闭包执行时的上下文对象。

------解决方案--------------------
探讨
JScript codevar testObj={
that:this,
context:"初始",
callback:function (str){//回调函数
alert("callback:我所处的上下文中,context="+that.context+",我被回调的方式:"+str);
}
};

这样可以吗?没测试过

------解决方案--------------------
说实话,很喜欢楼主的思想,当然不是这里的问题思想,而是楼主这个人的一些东西,真的,不知道怎么的,我也只是一个小普通人而已。

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有