在Javascript中创建闭包的块是什么

在Javascript中创建闭包的块是什么,javascript,closures,Javascript,Closures,在使用Javascript这么长时间后,我仍然无法接受闭包 作用{ 变量页=[1,2,3]; 对于页面中的var索引{ var p=页面[索引]; setTimeoutfunction{console.logp;},500; } }; JavaScript具有函数作用域,而不是块作用域。因此,当您在数组上循环时,请不要使用for..在for数组中,您创建了3个闭包。创建的每个闭包都引用相同的p变量。因此,当超时最终运行时,它们都将打印三个,因为它们都打印相同的p变量 您需要为数组中的每个元素创

在使用Javascript这么长时间后,我仍然无法接受闭包

作用{ 变量页=[1,2,3]; 对于页面中的var索引{ var p=页面[索引]; setTimeoutfunction{console.logp;},500; } }; JavaScript具有函数作用域,而不是块作用域。因此,当您在数组上循环时,请不要使用for..在for数组中,您创建了3个闭包。创建的每个闭包都引用相同的p变量。因此,当超时最终运行时,它们都将打印三个,因为它们都打印相同的p变量

您需要为数组中的每个元素创建一个新范围。幸运的是,JavaScript有一个内置函数用于此

作用{ 变量页=[1,2,3]; pages.forEachfunctionp{ setTimeoutfunction{console.logp;},500; }; }; 对于块,不创建闭包。在JavaScript中,只有函数创建作用域,并且是一个闭包。因此,您可以这样编写代码:

(function() {
    var pages = ["one", "two", "three"];
    for (var index in pages) {
        var p = pages[index];
        (function (p) {
          setTimeout(function() { console.log(p); }, 500);
        }(p));
    }
})();

由于延迟,p在读取时被重置。将p发送到函数

这个问题是因为setTimeout函数,所以需要实现函数,在这种情况下,该函数返回它命名为函数记录器的闭包的函数

(function () {
    var pages = ["one", "two", "three"];
    for (var index in pages) {
        var p = pages[index];
        setTimeout(logger(p), 500);
    }


})();

function logger(p) {
    return function () {
        console.log(p)
    }
}

你似乎把闭包和作用域搞混了。@FelixKling我试图澄清OP何时声明AFAIK p在for block创建的闭包内。啊,这现在更有意义了。语句函数创建闭包对我来说仍然很奇怪。我要说的是,函数创建作用域,是一个闭包。但可能只有我:@FelixKling我接受这个建议,并在等式中引入了函数作用域。这可能会有所帮助:,JavaScript中for block创建的闭包,block不会创建闭包。只有函数可以。为什么OP要尝试这个?他们显然不明白闭包在JS中是如何工作的,所以仅仅发布一些代码是没有帮助的
(function () {
    var pages = ["one", "two", "three"];
    for (var index in pages) {
        var p = pages[index];
        setTimeout(logger(p), 500);
    }


})();

function logger(p) {
    return function () {
        console.log(p)
    }
}