Javascript 回调和变量作用域
我正在学习learnyounode教程,遇到了这个有趣的地方,我正在试图弄清楚当您将变量用作回调函数时如何处理作用域: 以下代码起作用: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
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)
}
这是最好的吗?他妈的不
它有用吗?我想是的 您需要将回调作为参数传递。