2011-04-25 32 views
0

在这个函数:在javascript(jquery)调用中声明匿名函数时,closure如何工作?

var x = { 
    getStuff : function(){ 
    var i = 0; 
    $.getJSON('/url.json', {}, function(data){ 
     $.each(data, function(key,val){ 
      alert(i); 
     });    
    }); 
    }); 
} 

所以,我在正确理解该声明的2次jQuery的调用(.getJSON,。每)的匿名函数都有因关闭访问父功能(getStuff)?

这是否意味着在该位置声明的匿名函数位于其父项的范围链中,以便它们可以访问父项变量?

回答

0

除了通过变量“x”,匿名函数本身无法访问“getStuff()”。他们有权访问变量“我”,或更正确的变量“我”在实例的包含函数的本地范围的调用匿名函数被实例化。

每次调用“getStuff()”都会创建一个新的本地作用域,每个作用域都有自己的“我”和它自己的匿名函数。

+0

所以,当你谈论自己的“我”时,如果我改变“我”会改变所有引用“x”变量由于文字语法的对象? – James 2011-04-25 18:17:11

+1

@James:否 - 在进入函数的执行上下文时,会创建一个_new_ _VariableObject_(VA),并带有新的属性(链接到例如_i_) - 此对象将被放置在作用域链上创建/进入的任何函数_in_该上下文,所以这些将有权访问该_i_的特定实例。但是每输入一次函数,都会形成一个新的范围。 – 2011-04-25 18:21:17

+0

@James什么肖恩上面写的是正确的。每次调用“getStuff()”都会分配一个新的存储块,这意味着新的“i”。 – Pointy 2011-04-25 18:25:57

相关问题