Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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 回调和变量作用域_Javascript_Node.js - Fatal编程技术网

Javascript 回调和变量作用域

Javascript 回调和变量作用域,javascript,node.js,Javascript,Node.js,我正在学习learnyounode教程,遇到了这个有趣的地方,我正在试图弄清楚当您将变量用作回调函数时如何处理作用域: 以下代码起作用: module.exports = function(filePath, fileExtention, callback){ fs.readdir(filePath, function (err, list){ if(err) return callback("Something went wrong", null) var fileArr

我正在学习learnyounode教程,遇到了这个有趣的地方,我正在试图弄清楚当您将变量用作回调函数时如何处理作用域:

以下代码起作用:

module.exports = function(filePath, fileExtention, callback){
  fs.readdir(filePath, function (err, list){
    if(err) return callback("Something went wrong", null) 
    var fileArray = []
    list.forEach(function(file){
      if(file.indexOf('.' + fileExtention) > -1) fileArray.push(file)
    })
    return callback(null, fileArray)
  })
}
当此代码引发未定义的
fileExtention
异常时:

module.exports = function(filePath, fileExtention, callback){
  fs.readdir(filePath, cb)
}

var cb = function (err, list){
  if(err) return callback("Something went wrong", null) 
  var fileArray = []
  list.forEach(function(file){
    if(file.indexOf('.' + fileExtention) > -1) fileArray.push(file)
  })
  return callback(null, fileArray)
}
我试图理解为什么这个变量超出了定义为
cb
的第二个回调函数的范围,以及我将如何解决这个问题,因为回调的签名是固定的

解决方案是将局部变量设置为
fileExtention
参数吗

这是可行的,但是我不知道这是否是处理传递到模块中的回调以维护作用域的正确方法:

var fs = require('fs')
var fe = ""
var cb;
module.exports = function(filePath, fileExtention, callback){
  fe = fileExtention
  cb = callback;
  fs.readdir(filePath, findFiles)
}

var findFiles = function (err, list){
  if(err) return cb("Something went wrong", null) 
  var fileArray = []
  list.forEach(function(file){
    if(file.indexOf('.' + fe) > -1) fileArray.push(file)
  })
  return cb(null, fileArray)
}

这两个链接将帮助您更好地理解Javascript中作用域和闭包的工作原理:

一个很好的方法是创建另一个注释性函数,然后发送所创建函数的参数。诸如此类:

module.exports = function(filePath, fileExtention, callback){
  fs.readdir(filePath, function(err, list) {
    cb(err, list, fileExtension, callback);
  });
}

var cb = function (err, list, fileExtension, callback) {
  if(err) return callback("Something went wrong", null) 
  var fileArray = []
  list.forEach(function(file){
    if(file.indexOf('.' + fileExtention) > -1) fileArray.push(file)
  })
  return callback(null, fileArray)
}
我试图理解为什么这个变量超出了定义为cb的第二个回调函数的范围,以及我将如何解决这个问题,因为回调的签名是固定的

它超出范围,因为尝试使用它的函数在定义它的函数之外声明

解决方案是创建一个设置为FileExtension参数的局部变量吗

局部变量…在哪里

导出
功能中?这已经是
fileextension

cb
功能内部?你仍然需要从某处获得价值


解决方案是先执行您正在执行的操作,然后将create your函数放入
exports
函数中

或者,您可以创建另一个函数,该函数包含
cb
和对
fs.readdir
的调用,然后从
exports
调用该函数,并将需要的所有值作为参数传递给该函数


这是可行的,但是我不知道这是否是处理传入模块以维护作用域的回调的正确方法


经验法则是:避免使用全局变量。该特定构造看起来可能受到竞争条件的影响。

简短回答和修复方法:

module.exports = function(filePath, fileExtention, callback){
  var fileExtention = fileExtention
  fs.readdir(filePath, cb)
}

var cb = function (err, list){
  if(err) return callback("Something went wrong", null) 
  var fileArray = []
  list.forEach(function(file){
    if(file.indexOf('.' + fileExtention) > -1) fileArray.push(file)
  })
  return callback(null, fileArray)
}
这是最好的吗?他妈的不


它有用吗?我想是的

您需要将回调作为参数传递。