我在 node.js 中使用“二进制解析器”NPM 模块,并尝试使用我自己的“assert”函数,而不是内联提供它。我不知道问题是否是“二进制解析器”的问题,还是我对 JavaScript 中调用函数和/或函数引用的无知。
这是有效的代码,但不是我想要的:
var Parser = require('binary-parser').Parser;
var data = new Buffer([0x23, 0x36, 0x74, 0x0e, 0x01, 0xff, 0xff]);
function range (min, val, max) {
return (min <= val && val <= max);
}
var dataParser = new Parser()
.endianess('little')
.uint8('inside_humidity', {assert: function(x){return(x <= 100);}})
.uint16('barometer', {assert: function(x){return(20000 <= x && x <= 32500);},
formatter: function(x) {return x/1000;}})
.uint16('wind_direction', {assert: function(x){return(x <= 360);}})
.uint16('crc');
console.log(dataParser.parse(data));
我想这样调用我自己的“范围”函数:
.uint16('barometer',
{assert: range(20000, x, 32500),
formatter: function(x) {return x/1000;}})
但我得到:
ReferenceError: x is not defined
所以我尝试了:
assert: function(x){range(20000, x, 325000)}
和
{assert: function(x){range.bind(this, 20000, x, 32500)},
并得到:
ReferenceError: range is not defined
可以做我想做的事吗?
最佳答案
您将需要使用闭包:
function range(min, max) {
return function(x) {
return min <= val && val <= max;
};
}
有了它你就可以写了
…
.uint8('inside_humidity', {assert: range(-Infinity, 100)})
.uint16('barometer', {assert: range(20000, 32500), formatter: function(x) {return x/1000;}})
.uint16('wind_direction', {assert: range(-Infinity, 360)})
…
关于javascript 使用非内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37597883/