javascript 使用非内联函数

标签 javascript node.js function

我在 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/

相关文章:

node.js - Node.js keycloak 中的策略执行

javascript - express 4 的异步包装函数不会捕获错误

node.js - 在我的 eslint 上关闭 console.log 的错误

javascript - 如何在特定的 div 中显示时间(由 JavaScript 生成)?

r - 从函数调用中提取函数调用名称

javascript - 添加几个 json 数组并根据菜单元素点击过滤它们

javascript - 无法使用javascript更改href的值

javascript - 无法让 Javascript 与 Flash 交互

javascript - 如何从tinymce列表框控件项内部获取属性值

sql - 从列返回 int 值的函数 - SQL