Using closures in node js
Using closures in node js
使用以下方法有什么区别?
第一种方法:
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闭包中访问该变量,因为它是全局对象的一部分。(好吧,我假设这是因为你没有显示这个代码被其他任何东西所包围)。
相关文章:
- 在索引.html和应用.js [node.js] 之间共享变量
- JS(node.js)而循环不起作用
- 如何使用 JS (Node.js) 防止 HTTP 查询中允许使用 UTF8 字符串
- Angular JS & Node Webkit Routing
- 当作为脚本运行时.js Node中“this”的上下文是什么
- JS/Node:- 使用 node.io 选择标记
- JavaScript 如何让节点在返回 node.js/Node-RED 之前等待
- 处理快速连续的函数调用 - Javascript / underscore.js / node.js
- 如何在一台服务器中运行不同的.js文件.js NODE JS中的文件
- JS node-mysql bools 表现得很奇怪
- Node.js+Node Webkit+基于Node串行端口的应用程序-这可能吗
- 如何在Express.js/Node.js中检查查询字符串是否有值
- Express.Js, Node.Js, MongoDB Questions
- 在JS/Node中,当多个人编辑相同的记录时,如何避免数据冲突?有图案吗
- 服务器端js(node.js)上的同步
- 将参数从jade发送到js/node
- angular.js+node.js/electron中的Promise;不起作用
- 是否有可能确定我的应用程序的aws实例使用js/node aws-sdk
- Image Magick模块抛出奇怪的错误(Express js Node js)
- 用JS (Node.js)读取文本文件'