Using closures in node js

Using closures in node js

本文关键字:js node in closures Using      更新时间:2023-09-26

使用以下方法有什么区别?

第一种方法:

for(var i = 0; i < 10; i++) {
    (function(e){
        setTimeout(function() {
            console.log(e); 
        }, 1000);
    })(i);
}
for(var i = 0; i < 10; i++) {
    createTimeoutFunction(i);
}

第二种方法:

function createTimeoutFunction(e){ 
    setTimeout(function() {
        console.log(e); 
    }, 1000);
}
for(var i = 0; i < 10; i++) {
    createTimeoutFunction(i);
}

我是nodejs和闭包使用方面的新手。虽然两个方法都返回相同的输出,但第二个方法运行时出错。我不明白为什么我们需要像第一种方法那样使用两个循环。我们不能像第二种方法那样执行吗?

删除第一个方法中的第二个for,因为除非您希望循环运行两次,否则它是多余的,因为第一个方法已经发生了所有事情。第二个循环失败,因为与第二个方法相反,createTimeoutFunction从未在第一个循环的范围之外定义。

除此之外,它们都将产生相同的结果,唯一的区别在于第二种方法createTimeoutFunction是可重用的。

另请参阅:JavaScript闭包是如何工作的?

javascript中的闭包无论使用什么环境或解释器都能正常工作。

闭包提供了一个特定的变量范围,代码集在其中执行。您的闭包(显然)可以访问其内部定义的任何内容,以及任何封闭闭包中定义的任何对象。

在上面编写代码的问题是,在第一个示例中,createTimeoutFunction没有在任何地方定义——当您调用它时,它将失败。在这个例子中:

(function(e){
    setTimeout(function() {
        console.log(e); 
    }, 1000);
})(i);

在这个闭包中定义的函数是一个匿名函数。它没有name属性,不能被引用。

第二个版本定义了一个全局变量createTimeoutFunction,然后可以在页面上的ANY闭包中访问该变量,因为它是全局对象的一部分。(好吧,我假设这是因为你没有显示这个代码被其他任何东西所包围)。