Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在节点js中使用闭包_Javascript_Node.js_Closures - Fatal编程技术网

Javascript 在节点js中使用闭包

Javascript 在节点js中使用闭包,javascript,node.js,closures,Javascript,Node.js,Closures,以下方法的使用有什么不同 第一种方法: 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 createTimeo

以下方法的使用有什么不同

第一种方法:

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);
}
for(变量i=0;i<10;i++){
(职能(e){
setTimeout(函数(){
控制台日志(e);
}, 1000);
})(i) );
}
对于(变量i=0;i<10;i++){
createTimeoutFunction(i);
}
第二种方法:

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);
}
函数createTimeoutFunction(e){
setTimeout(函数(){
控制台日志(e);
}, 1000);
}
对于(变量i=0;i<10;i++){
createTimeoutFunction(i);
}

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

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

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


另请参见:

javascript中的闭包工作原理相同,无论您使用的是什么环境或解释器

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

在第一个示例中,
createTimeoutFunction
没有在任何地方定义,当您调用它时,它将失败。在这个例子中:

(function(e){
    setTimeout(function() {
        console.log(e); 
    }, 1000);
})(i);
此闭包中定义的函数是匿名函数。它没有
名称
属性,不能被引用


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

第一个方法有点错误,因为
createTimeoutFunction
不存在第二个方法会给您带来什么样的错误?@raina77ow如果我在终端中尝试上述代码作为第二个方法,它会打印
数组布尔日期错误求值错误函数无穷JSON数学NaN数字对象范围错误引用错误RegExp String SyntaxError TypeError URIError decodeURI decodeURI component encodeURI encodeURI component eval isFinite isNaN parseFloat parseInt undefined
函数createTimeoutFunction(e)的10次{
。为什么会这样?@user850234我想这是因为REPL的性质。当您将第一行更改为
var createTimeoutFunction=function(e)…
?@user850234顺便问一下,当您运行它(使用
节点somescript.js
)时,它的行为如何?