ajax-javascript-范围链、call对象与闭包

时间:2010-02-06 12:29:07  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:ope&Call Object      当函数被调用时,解释器为其创建一个上下文,当函数返回时,解释器回到最初的上下文。解释器形成一个上下文栈。上下文包含:全局上下文和局部上下文。      创建上下文会伴随一系列对象的创建,包含:      Call Object:此对象包含一个arguments属性指向arg...
  正文:闭包基础
  都知道,局部变量隐藏全局变量,为什么会隐藏?
  
  因为函数对象的[[scope]]内部属性,闭包能实现也因为有这个对象。
  
  Excution Context&Scope&Call Object
  
  当函数被调用时,解释器为其创建一个上下文,当函数返回时,解释器回到最初的上下文。解释器形成一个上下文栈。上下文包含:全局上下文和局部上下文。
  
  创建上下文会伴随一系列对象的创建,包含:
  
  Call Object:此对象包含一个arguments属性指向argumets对象。
  
  argumentsObject:保含的是调用者指定的参数和被调用函数无关。赋值给Call Object的arguments属性。
  
  Scope Object:创建scope对象,并加入scope链,把call Object加入到链头,然后赋值给function object的[[scope]]属性。
  
  Variable Object:在此初始化了三种类型的变量:局部变量被初始化为undefined。如果正式的参数(注意不是arguments中的参数)在arguments中有值,用值初始化,否则也初始化为undefined。初始化内部函数。Variable Object指向Call,他们相同。
  
  上面是局部上下文,全局上下文比较简单,只包含一个globle对象。别的对象不会被创建,因为没有意义。
  
  可以看到只要通过函数对象的[[scope]]内部属性,就能得到函数所需的所有运行信息。
  
  注:
  
  正式参数:这里指实际参数。
  
  上面只是简要说明,只是解释了和闭包有关部分,并不严格,详细的参见ecma-262。
  
  Eval&with
  
  eval创建新的上下文
  
  with会打破现在的上下文
  
  闭包
  
  在Js中函数嵌套被返回时闭包就形成。因为函数有内置的[[scope]]属性,保持了内层函数的引用,也就保持了整条从内部到globle链的引用。整条链资源不能被释放,当然也能访问链上的变量。
  
  解释闭包的例子
  
  
  
  
  var x= 5;     //范围globle开始
  
  
  
  var y=30;
  
  function f(y){ //范围f开始
  
  
  
  
  
   return function g()     //范围g开始
  
   {
  
   var z=10;
  
   document.write(x+y+z)
  
   } //范围g结束
  
  } //范围f结束
  
  
  
  var f1 = f(5);  输出20 //范围globle结束
  
  在g()被执行时,g()的[[scope]]会指向下面的链:
  
  首先是g的call object:包含变量z。
  
  然后是g的scope对象
  
  再后面是f的call objec:包含y
  
  再后是f的scop
  
  再后是globle object:包含x,y
  
  
  
  因此执行时,由于g存活,整条链就可以使用,闭包得以形成。变量定位也从当前call object开始,会隐藏同名的y(参数y隐藏全局y)。
  
  另一种隐藏是prototype chain,虽然都隐藏变量,但他们完全不同,也没有任何关系,详细见,上一篇继承。
  
  MicrosoftAjax.js中的闭包
  createCallback& createDelegate
  
  事件不用闭包的实现方式:
  
  
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
"ajax-javascript-范围链、call对象与闭包"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Programming/aspnet/12811.html


关键字:

关于《ajax-javascript-范围链、call对象与闭包》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td