回调和变量范围

时间:2015-09-18 16:56:28

标签: javascript node.js

我正在研究learnyounode教程并遇到了这个有趣的内容,我试图找出当你使用变量作为回调函数时如何处理范围:

以下代码有效:

shape LeftTopLabel { }

shape RightTopLabel { }

shape MiddleBottomLabel { }

虽然此代码抛出了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

3 个答案:

答案 0 :(得分:1)

这两个链接将帮助您更好地了解范围和闭包在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)
}

答案 1 :(得分:1)

  

我试图理解为什么该变量超出了第二个回调函数的范围,该函数被定义为cb以及我将采取什么措施来解决这个问题,因为该回调的签名是固定的。

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

  

解决方案是否会创建一个设置为fileExtention参数的局部变量?

一个局部变量......在哪里?

[NSFont systemFontOfSize: weight:]函数内?那已经exports了。

fileExtention函数内?你仍然需要从某个地方获得价值。

解决方案是首先做你正在做的事情,然后在cb函数中创建你的函数。

或者,你可以制作另一个函数,其中包含exportscb的调用,然后从fs.readdir调用该函数传递 all 你需要的值作为参数。

  

这有效,但是我不知道是否正确处理传递给模块的回调来维持范围

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

答案 2 :(得分:0)

简短回答以及如何解决问题:

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)
}

最好吗?不,不!

有用吗?我想是的!