【发布时间】:2017-08-08 11:52:15
【问题描述】:
考虑以下节点模块。它产生一个指定秒数的睡眠进程并返回其 PID。当进程退出时,它会触发提供的回调。
//module.js
const spawn = require('child_process').spawn;
function run(delay, cb) {
var args = [delay];
var process = spawn('sleep', args);
(function(process, cb) {
process.on('close', (code, signal) => {
cb(process.pid);
});
})(process, cb);
return process.pid;
}
module.exports = {
run: run
}
测试代码调用模块 3 次,并将 pid 与不同的字符串一起保存以区分回调。
var sleep = require("module");
var pids = {};
var cb = function(pid) {
console.log(pids[pid]);
}
pids[sleep.run(1, cb)] = 'cb1';
pids[sleep.run(2, cb)] = 'cb2';
pids[sleep.run(3, cb)] = 'cb3';
代码完美运行,输出为:
cb1
cb2
cb3
我的困惑源于即使模块中没有闭包,代码也能完美运行,如下所示:
const spawn = require('child_process').spawn;
function run(delay, cb) {
var args = [delay];
var process = spawn('sleep', args);
//(function(process, cb) {
process.on('close', (code, signal) => {
cb(process.pid);
});
//})(process, cb);
return process.pid;
}
module.exports = {
run: run
}
我没想到代码在没有闭包的情况下运行。调用第一个/第二个回调时 process 的值是多少?这不就是第三道工序的价值吗?
【问题讨论】:
-
所有对
run()的调用都会创建一个新的闭包,其中包含自己的process变量和一个可以访问它的新内部箭头函数。 -
按写的方式,没必要....
-
您的困惑可能源于您对术语的滥用。在第一版和第二版代码中,您都创建了闭包。第一个版本是事件处理程序和匿名函数(IIFE)之间的闭包,第二个版本是事件处理程序和
run()函数之间的闭包 -
查看我对这个问题的回答以了解“闭包”与您认为在第一个版本中尝试做的事情之间的区别:stackoverflow.com/questions/40414659/…
标签: javascript node.js closures