0
for(var i = 0; i < 5; i++) {
    (function() {
        setTimeout(function() {
            console.log(i);
        }, i * 1000);
    })(i);
}
问输出什么?

我其实是想问的
是不是可以拆一下,拆成

for(var i=0;i<=5;i++){
function ret(i){
function timer(){
console.log(i);
}
setTimeot(timer,i*1000);
}
ret(i);
}

原题自己跑过了,输出的是5个5
是不是可以理解为:因为根本没有i传入到块级作用域里面去,所以里面跑的还是外面跑完之后的i?
不知道上面的理解的对不对,求大佬指点一下,看了一晚上闭包,看的要死啦....
求大佬推荐IIFE方面的文章,看了好几篇都感觉理解不了闭包和IIFE。

查看全部 6 个回答

0
for(var i = 0; i < 5; i++) {
    (function(i) {        //加个i,把i传进去
        setTimeout(function() {
            console.log(i);
        }, i * 1000);
    })(i);
}

这样就等价于你第二种写法,第一种i没传进去,访问的就是全局变量i,等定时器执行的时候for循环已经结束,i=5

推荐答案

4

已采纳

第一:因为i没传进去

第二:拆成那样也行,但是你的setTimeout英文掉了个u..,简化一下可以写成如下:

  for (var i = 0; i <= 5; i++) {
        ((i) => setTimeout(() => console.log(i), i * 1000))(i);
    }

第三:关于IIFE,给你道题目做吧。。。

题目:请将下列代码至少使用【两种】方法修改,让调用时输出"小明"(调用部分不能更改)

    var name = "老王";
    var person = {
        name: "小明",
        whoName: function() {
            console.log(this.name);
        },
        tellMe: function() {
            var that = this;
            (function(callback) {
                callback();
            })(that.whoName);
        }
    };
    person.tellMe()//此处不能修改

顺便,你大概不是没理解闭包,而是没理解【匿名函数的作用域】

+1
回复 临水照花

callback这里其实等同于 var callback=function(){console.log(this.name);}

(that.tellMe)只是把【外部that】指向的函数部分赋值给callback参数了,callback()调用时并没有使用【外部that】保存的this的当前状态,callback使用的还是匿名函数内部的this。

所以解决方法其实都一样:

可以:callback.call(that);

可以:直接调用that.tellMe();不用callback,不过这样就和把匿名函数删除一样了

可以:删除var that=this; 传参(this.tellMe) 执行callback.call(person);

等等。。。

抓不住的月光 · 3月21日

展开评论
SegmentFault

一起探索更多未知

下载 App