javascript中回调函数的命名空间问题

先看这样一段脚本:

 

  1. <script type= "text/javascript" >
  2.              var  data;
  3.              var  url =  'aa.html' ;
  4.              function  fuzhi(response){
  5.                  var  str = unescape(response.responseText);
  6.                 data = eval(str);
  7.             }
  8.              new  Ajax.Request(url,{
  9.                 method: 'get' ,
  10.                 onSuccess:fuzhi
  11.             });
  12.             
  13.             alert(data);
  14.             
  15.         </script>

 

结果会显示data是undefined,我命名在回调函数中对data赋值了,可是为什么会是undefined呢?

 

再进行一下修改:

 

  1. <script type= "text/javascript" >
  2.              var  data;
  3.              var  url =  'aa.html' ;
  4.              function  fuzhi(response){
  5.                  var  str = unescape(response.responseText);
  6.                 data = eval(str);
  7.                 alert(data);
  8.             }
  9.              new  Ajax.Request(url,{
  10.                 method: 'get' ,
  11.                 onSuccess:fuzhi
  12.             });     
  13.             
  14.         </script>

 

这回可以了,因为我将alert语句移动了位置,导致了结果不同,所以初步猜想跟作用域有点关系。

 

new Ajax.Request中,fuzhi方法是作为一个匿名对象当中的方法传送出去的,因而无法得知函数是如何被调用的

 

另外还有一样东西,看看下面的例子:

varsDs.load

(
{

callback: function


(

records)
{


  col_length = varsDs.getCount

(
)

;//这里的varDs离开了作用域?



  //col_length = this.getCount();//这个this等于store吗?



  for


 (

var


 x = 0

; x < col_length; x++)


  {


  colarray[

x]

 = varsDs.getAt

(

x)

.get

(

'hex'

)

;
  }


}
}
)

;

不过可以写得更清晰:

var


 obj = {


   callback: function


(

records)
{


      col_length = varsDs.getCount

(
)

;//这里的varDs离开了作用域?



      //col_length = this.getCount();//这个this等于store吗?



      // ...



   }


}

;
varsDs.load

(

obj)

;

现在函数callback直接挂在obj上,因此this指针等于obj。

但是注意 : 这样做没用的。为什么?因为你不知obj.callback最终执行时发生什么情形。试想一下Ext.data.Store的load方法(仿造的实现):

...
	load

 : function


(

config)

 {


		var


 o = {
}

;
		o.callback

 = config.callback

;
 
		  //进行加载



 
		o.callback

(
)

;
	}


...

这个仿造的实现中,回调函数的作用域是私有变量“o”。 因为通常你无法得知函数是如何被调用的,如果不声明作用域,你很可能无法在回调函数中使用this参数。

 

参考自:http://extjs.com/learn/What_is_that_Scope_all_about2_%28Chinese%29

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值