javascript闭包问题

<scripttype="text/javascript">functionfoo(x){vartmp=3;functionbar(y){alert(x+y+(++tmp... <script type="text/javascript">
function foo(x)
{
var tmp = 3;
function bar(y)

{
alert(x + y + (++tmp));
}
return bar(10);
}
var z=foo;
foo(2);
foo(2);
foo(2);
</script>
执行上面的三次调用后,三次都提示16!tmp并没有执行前增量操作;以上是根据我自己对闭包的理解写出来的代码,与真正的完整闭包后的代码存在巨大差距!
以下是完整闭包后的代码:
function foo(x) {
var tmp = 3;
return function (y) {
alert(x + y + (++tmp));
}
}
var bar = foo(2);
bar(10); //16
bar(10); //17
bar(10); //18
不知道我的错在哪里?
最后在解释下:
1:闭包的函数是哪个?是两个函数(内外部)都闭包了吗?
2:函数闭包之后,与没闭包有什么区别?
展开
 我来答
xi8km9
2015-08-05 · TA获得超过1086个赞
知道小有建树答主
回答量:688
采纳率:50%
帮助的人:716万
展开全部
闭包就是作用域
所有闭包内的函数都可以访问这个闭包内的对象
所有的函数调用时都产生闭包

也就是说
var z=foo
你可能想模拟bar = foo(2)
但这里z只是简单的与foo指向了同一个函数
而bar是获取了一个foo的闭包域里的函数
foo(2)
你的z并没有产生闭包作用域, 所以没什麽效果
更多追问追答
追问
1:调用函数的时候会产生闭包,而闭包又是作用域,所以一个函数的内容其实就是一个闭包作用域,是这样吗?
2:如果是的话,闭包作用域的效果是什么?只是闭包内的所有函数都可以访问闭包内的变量?如果是,那var tmp=3和(++tmp)操作后的结果由谁来保存并再次进行增量操作?(网上看到:局部变量的值在函数调用一次后就会被破坏然后重新创建回初始值吗?)这也是我最不理解的地方!
因为我的代码就没进行增量操作
追答
这么说吧, 死扣定义是没意义的
闭包可以说是个人为抽像出来的概念
这个概念统一了不同作用域传值的问题, 其特点都是在调用中把作用域内的函数暴露
无论是使用window.xxx = function(){}
或是return function(){}
等等, 都可以使作用域外的变量间接的访问到这个内部作用域的变量

在JavaScript中, 所有的函数调用都会产生一个作用域
function()
{
var Temp;
}
每调用上面的函数都会申请新的空间存放不同的Temp
而JS的垃圾回收机制会吧像上面这种简单函数在执行完毕後清理掉
JS查找变量是由最近的闭包域向上查找的

对於那个完整的foo函数, 只有在调用後产生临时作用域, 而返回值是个函数, 那麽由於引用关系, JS并不会这麼快的清理掉它, 因而称之为闭包

对於每次调用的foo(2)
function foo(x)
{
//产生局部作用域
var tmp = 3;
//tmp保存在该作用域内
function bar(y)
{
alert(x + y + (++tmp))
}
//新生成函数bar并保存在该作用域
return bar(10)
//并没有向作用域外引出函数, 因而没有只返回了结果然後这个作用域就被销毁了
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式