javascript:bind()第一个参数是一个函数

时间:2015-12-10 16:09:08

标签: javascript

我对javascript相对较新,并且遇到了一些看似奇怪的使用bind()我试图理解。它涉及Razberry,一个用于控制ZWave界面的Raspberry Pi插件。

ZWave界面是通过在Pi上运行的网络服务器访问的,主要用javascript编写。软件界面包括可用于进程间通信的事件系统。事件由绑定到各种对象触发:

zway.devices[2].instances[1].SwitchBinary.data.level.bind(function() {
    state = 'on';
    if (this.value == '0')
        state = 'off';
    eventString = 'Device_2_Instance_1_' + state; 
    try {
        // do interprocess stuff via, e.g., sockets
        return;
    } catch(err) {
        debugPrint("Failed to execute script system call: " + err);
    }
});

... data.level对象包含各种属性,包括示例代码中显示的“value”。

从我关于bind()的阅读中,我希望看到它的第一个参数成为'level'内的'this',即使'level'不是函数。

看起来像使用bind()这种方式是为了给出绑定的匿名函数 - 'this'参数 - 访问'level'的属性,并在每次'level'被赋值时执行。至少,我认为这是目标,因为只要某事被分配到“级别”,就会提出一个事件。

这是一个合理的解释吗?人们是否熟悉这种构造/模式来引发事件?

bind()源代码

关于bind()的好处不一定是默认的javascript bind()。我挖了服务器源代码,发现了以下内容:

// Create a function bound to a given object (assigning `this`, and arguments,
// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
// available.
_.bind = function(func, context) {
    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
    var args = slice.call(arguments, 2);
    return function bound() {
        return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
    };
};

看起来开发人员打算模仿本机bind()功能。所以我仍然对这个实例中bind()的行为感到好奇。

0 个答案:

没有答案