【问题标题】:Explain how the code works解释代码是如何工作的
【发布时间】: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


【解决方案1】:

函数(code, signal) => { cb(process.pid); } 仍然是模块中的闭包。它关闭的范围由run 函数提供(并包含变量delaycbargsprocess),而不是IIFE(其范围仅包含process 和@ 987654328@ 变量覆盖了来自 run 的变量。

【讨论】:

    猜你喜欢
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2023-01-12
    • 2015-03-23
    相关资源
    最近更新 更多