先看这样一段脚本:
- <script type= "text/javascript" >
- var data;
- var url = 'aa.html' ;
- function fuzhi(response){
- var str = unescape(response.responseText);
- data = eval(str);
- }
- new Ajax.Request(url,{
- method: 'get' ,
- onSuccess:fuzhi
- });
- alert(data);
- </script>
结果会显示data是undefined,我命名在回调函数中对data赋值了,可是为什么会是undefined呢?
再进行一下修改:
- <script type= "text/javascript" >
- var data;
- var url = 'aa.html' ;
- function fuzhi(response){
- var str = unescape(response.responseText);
- data = eval(str);
- alert(data);
- }
- new Ajax.Request(url,{
- method: 'get' ,
- onSuccess:fuzhi
- });
- </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