| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 432 人关注过本帖
标题:JS新手问个关于闭包和函数作用域链的问题~谢谢
取消只看楼主 加入收藏
jsbeginner84
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-4-13
结帖率:0
收藏
已结贴  问题点数:20 回复次数:0 
JS新手问个关于闭包和函数作用域链的问题~谢谢
function  makefunc(x)   {
     return   function ()  {  return  x; }
}

var  a  =  [makefunc( 0 ), makefunc( 1 ), makefunc( 2 )];


alert(a[ 0 ]());   //  Displays 0
alert(a[ 1 ]());   //  Displays 1
alert(a[ 2 ]());   //  Displays 2




请问下为什么当makefunc( 0 ), makefunc( 1 ), makefunc( 2 ) 分别被调用的时候,他们生成的调用对象/活动对象(call object) 都是不同的呢?   (3个调用对象,即每调用makefunc()生成一个调用对象)


即:为什么不是这么一种情况:makefunc( 0 ), makefunc( 1 ), makefunc( 2 )分别被调用时,生成的是同一个调用对象,而这个调用对象里的X属性,每次调用的时的值都不一样,分别是0,1,2


(我的意思是,为什么当makefunc() 被调用三次,会生成三个不同的调用对象(被调用时实际参 数不一样)。这三个不同的调用对象里X的属性的值分别是0,1,2. 然后0,1,2 分别被a[ 0 ](),a[ 1 ](),a[ 2 ]()读取到。因为a[ 0 ](),a[ 1 ](),a[ 2 ]()的调用对象里没有属性x 的定义,所以从上层作用域里去读取。

我想不通的是为什么不是这种情况,即:makefunc( 0 ), makefunc( 1 ), makefunc( 2 )分别被调用时,生成的是同一个调用对象,当a[ 0 ](),a[ 1 ](),a[ 2 ]()到这个调用对象里来读X 的值时,x 的值都不一样(分别是0,1,2)。就像给一个变量赋了3个值一样。然后再被a[ 0 ](),a[ 1 ](),a[ 2 ]()读取到。不知道我说清楚了没有。。。)
搜索更多相关主题的帖子: 函数 闭包 
2010-04-13 12:16
快速回复:JS新手问个关于闭包和函数作用域链的问题~谢谢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023502 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved