| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 432 人关注过本帖
标题:JS新手问个关于闭包和函数作用域链的问题~谢谢
只看楼主 加入收藏
jsbeginner84
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-4-13
结帖率:0
收藏
已结贴  问题点数:20 回复次数:1 
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
frankqnj
Rank: 4
等 级:贵宾
威 望:12
帖 子:320
专家分:278
注 册:2008-4-6
收藏
得分:20 
无他原因. 闭包尔.

每次函数 makefunc 被调用时 会产生一个 闭包对象..这个闭包对象 会保存 一些状态  比如 其 局部变量x  的值.

而 makefunc 函数内部的 那个匿名函数  其作用域 隶属于 makefunc的 无论 该函数 在哪里被调用.  这就是 js的词法作用域 这和其他语言的 运行时作用域 有很大区别 ...  即 函数声明在哪里 他的作用域就在哪里 . 而x的值 是存放在闭包对象中的..

至于你的疑惑 . 你只需要记得  函数体内部的  内层函数声明 每次 外层函数被调用 都会导致 内部重新声明一个函数.  

你的意思是 出于内存考虑  js更应该 函数只产生一个  然后让他们 去访问 不同的闭包对象 即可 .很遗憾  js不是这样做的.
2010-04-13 19:28
快速回复:JS新手问个关于闭包和函数作用域链的问题~谢谢
数据加载中...
 
   



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

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