JavaScript闭包的3个问题
发布网友
发布时间:2022-04-23 01:16
我来回答
共5个回答
热心网友
时间:2022-04-18 10:57
第一个不是闭包,是匿名函数。。。
因为隔了一秒后,循环已经执行完了,你去掉延时执行就能看到每步打印的数据了;
第二个也不是闭包。。。
因为js的执行环境是先初始化变量,再按顺序执行,很明显a函数执行的时候,循环已经结束了,所以获得的值也就是3
第三个是返回的最后一个执行完的b函数,而b函数里边的i是索引的最后一个i,所以执行就是一个3
对于你补充的3的答案,还是那句话,b函数获取到的是最后的i了
建议楼主去了解下js的作用域链方面的知识追问我已经看了一下js的作用域链方面的知识 ,也看了一些网友的介绍,我感觉是不是内函数执行的时候如果本身没有定义i这个变量,就回去外函数寻找i,而此时的这个i为什么就是最后的i?是不是当执行b时,a已经执行过了?
追答对,作用域链有些类似原型链,当在自身域找不到相关的变量时,就会往上一级查找,直到到达顶级object;
可以这么理解,b获取到是执行后的值;
热心网友
时间:2022-04-18 12:15
1. 因为执行时是异步的,当它执行时,去取变量 i 的值,这时 i = 10. 所以每次都是 10. setTimeout 后延迟 1 秒执行,1 秒内 for 循环肯定执行完了,所以 i = 10. 要注册异步执行时,创建 closure 时只给出变量符号名,执行时才去取这个变量的值,为了能把当时的值复制过去,我们需要创建一个对象将这个值复制一份。
<script>
var Handler = function(no){
var _no = no;
this.run = function() {
alert(_no);
};
};
for(var i=0;i<10;i++){
setTimeout(new Handler(i).run,1000);
}
</script>
2. 因为 for 循环里面把 a 这个函数重新定义了 3 遍,你只能使用最一次的定义。
3. 问题3参考问题2,一样的道理,重新定义过 3 次,只能使用最后一次的定义。
热心网友
时间:2022-04-18 13:49
每个对象都有一个作用域链,作用域链上有从当前对象作用域到最外层也就是window的作用域。
依次向下访问,而作用域链上保存的是整个变量对象而不是某个特殊的变量。所以你只能访问到你外层对象的最终值,也就是该对象已经执行完了以后的值。如果想获得每一个值,可以用匿名函数
for(var i=0;i<3;i++){
(function(){
function b() {
alert(i);
}
})(i);
}
每次循环把值传给匿名函数就行了,这种情况很常见。
javascript高级程序设计第三版 P181 讲过
楼主给分
热心网友
时间:2022-04-18 15:41
1-for循环相当定义了10个setTimeut(),而内部函数只取最后一个值,这个值为10,故弹出10次10;
不是闭包.
2也不是闭包.如果要循环,用匿名函数可以这样
for(var i=0;i<3;i++){
(function a(i) {//注意这里
alert(i);
})(i)//注意这里,传入每次循环的i值来保存现场
}
3是闭包.由于返回的b闭包是a运行后的结果,故此时内部for循环早已循环完,i最终值为3,所有
myF()也只能读取到最终值 3
热心网友
时间:2022-04-18 17:49
你的java有很大的问题新下一个吧!追问什么意思?我问的是js