我对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()的行为感到好奇。