0

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

第一种方法:

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);
}

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

4

2 回答 2

1

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

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

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

于 2012-08-22T11:33:39.760 回答
0

无论您使用何种环境或解释器,javascript 中的闭包都一样。

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

你代码的问题是在第一个例子createTimeoutFunction中没有在任何地方定义——当你调用它时它会失败。在那个例子中:

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

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

第二个版本定义了一个全局变量createTimeoutFunction,然后可以在页面上的任何闭包中访问它,因为它是全局对象的一部分。(好吧,我假设因为您没有显示此代码包含在其他任何内容中)。

于 2012-08-22T11:38:49.020 回答