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
)时,它的行为如何?