關于javascript 回調函數中變量作用域的討論
2024-05-06 14:14:08
供稿:網友
1、背景
Javascript中的回調函數,相信大家都不陌生,最明顯的例子是做Ajax請求時,提供的回調函數,
實際上DOM節點的事件處理方法(onclick,ondblclick等)也是回調函數。
在使用DWR的時候,回調函數可以作為第一個或者最后一個參數出現,如:
JScript code function callBack(result){ } myDwrService.doSomething(param1,param2,callBack);//DWR的推薦方式 //或者 myDwrService.doSomething(callBack,param1,param2);
2、問題描述
最近在使用Dojo+Dwr的時候,碰到一個問題:
如果回調函數是屬于某個對象(記為obj1)的方法,等到DWR執行該回調函數的時候,
上下文卻不是obj1。
表現的現象就是在回調函數中訪問obj1的任何屬性都是undefined。
版本:Dojo1.3.1和dwr2
3、模擬問題的代碼
下面的測試代碼可以模擬這個問題:
JScript code
代碼如下:
<html>
<head>
<script type="text/javascript"><!--
var context="全局";
var testObj={
context:"初始",
callback:function (str){
//回調函數
alert("callback:我所處的上下文中,context="+this.context+",我被回調的方式:"+str);
}
};
//創建一個對象,作為測試回調函數的上下文
testObj.context="已設置";
function testCall(){
callMethod(testObj.callback);
callObjMethod(testObj,testObj.callback);
}
function callMethod(method){
method("通過默認上下文回調");
}
function callObjMethod(obj,method){
method.call(obj,"指定顯式對象上下文回調");
}
// --></script>
</head>
<body> <a href="javascript:void(0)" onclick="testCall()">調用測試</a> </body>
</html>
在callObjMethod方法中,我用了兩種方式回調“method"方法:
第一種方式:method("通過默認上下文回調");
沒有指定上下文,我們發現回調函數內部訪問context的值是全局變量的值,
這說明,執行該方法的默認上下文是全局上下文。
第二種方式:method.call(obj,"指定顯式對象上下文回調");
指定obj為method執行的上下文,就能夠訪問到對象內部的context。