在映射字符串数组时,在 Node.js 中看到奇怪的行为。在下面的代码中,第一个映射函数正确打印 images
数组中的字符串。就在下面一行,对于循环中的每个项目,imgName
变量都是未定义
。
images.map(function(imgName){console.log(imgName)}) // this properly prints each string in the array
images.map(function(imgName) { // each imgName returns undefined
// first check the size of the image and instantiate canvas
var dimensions = sizeOf(imgpath+imgName);
if(debug) { console.log("Image dimensions "+imgpath+imgName+": "+dimensions.width+","+dimensions.height); }
var canvas = new Canvas(dimensions.width, dimensions.height);
var ctx = canvas.getContext('2d');
var Image = Canvas.Image;
global.canvas = canvas;
global.ctx = ctx;
global.Image = Image;
var img = new Image;
img.src = fs.readFileSync(imgpath+imgName);
tracking.track(img, tracker);
});
唯一让我认为有什么东西干扰 map 的是回调底部的 tracking
变量是沙箱的。这是我实例化它的方法:
var sandbox = function (files, sandbox) {
var source, script, result;
if (!(files instanceof Array)) {
files = [files];
}
source = files.map(function (file) {
return fs.readFileSync(file, 'utf8');
}).join('');
if (!sandbox) { sandbox = {}; }
script = new Script(source);
result = script.runInNewContext(sandbox);
return sandbox;
};
// instantiate sandboxed tracking class
var tracking = sandbox('./node_modules/tracking/build/tracking.js',{ navigator: {}, tracking: {}, window: {} }).tracking;
这个“沙箱”是否可能干扰循环范围内的变量(这个沙箱是在循环之前实例化的)?还是有其他原因?
更新
我意识到,如果我删除所有代码并开始在循环中逐行添加每一行,那么 imgName
变量实际上就已定义。看来无论出于何种原因,当回调函数内抛出错误时,它就会变得未定义。这很困难,因为它似乎掩盖了实际的错误并阻碍了调试。这是控制台中的错误:
fs.js:500
return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
^
Error: ENOENT, no such file or directory '/Users/.../images/undefined'
at Error (native)
at Object.fs.openSync (fs.js:500:18)
at syncFileToBuffer (/Users/.../index.js:58:23)
at module.exports (/Users/.../index.js:100:18)
at /Users/.../extractor.js:59:20
at Array.forEach (native)
at Object.<anonymous> (/Users/.../extractor.js:57:8)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
最佳答案
不存在诸如取消设置变量的错误或弄乱它们的神秘函数调用之类的事情,除非它们确实改变了它们的值。
这里唯一的问题是数组中有一个未定义的值。
关于javascript - 数组中的每个项目都是未定义的......即使它不是(Node.js - 沙盒脚本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31933185/