event/callback 函数的 IIFE 与 bind()
IIFE vs bind() for event/callback function
例如,我需要注册一个 onclick
事件,该事件调用另一个函数 sayHello()
来打招呼,其参数作为当前范围内可用的变量。
我可以使用 IIFE 将变量注入匿名函数的范围,如下所示:
var currentName = "James";
something.onclick = (function(name) {
return function() {
sayHello(name);
};
})(currentName);
不过,我也可以通过 bind()
方法使用柯里化函数的一个版本,如下所示:
var currentName = "James";
something.onclick = sayHello.bind(null, currentName);
尽管使用 IIFE 方法可以让您在匿名方法中执行不止一个函数调用,但将其换成柯里化方法有什么缺点吗?
function currying via the bind()
method
是partial application actually。
Are there any disadvantages to swapping out the IIFE for bind
?
您的方法之间的区别在于 bind
传递更多参数,而不是仅使用 name
调用 sayHello
。在这种情况下,事件参数将传递给处理程序而不是被忽略。当然这可以修复(使用 arguments
对象或 ES6 rest+spread),但这只会使它变得更加复杂和容易出错。
这就是 imo 的主要缺点:它相当长但不必要地更长。我比较喜欢简洁
例如,我需要注册一个 onclick
事件,该事件调用另一个函数 sayHello()
来打招呼,其参数作为当前范围内可用的变量。
我可以使用 IIFE 将变量注入匿名函数的范围,如下所示:
var currentName = "James";
something.onclick = (function(name) {
return function() {
sayHello(name);
};
})(currentName);
不过,我也可以通过 bind()
方法使用柯里化函数的一个版本,如下所示:
var currentName = "James";
something.onclick = sayHello.bind(null, currentName);
尽管使用 IIFE 方法可以让您在匿名方法中执行不止一个函数调用,但将其换成柯里化方法有什么缺点吗?
function currying via the
bind()
method
是partial application actually。
Are there any disadvantages to swapping out the IIFE for
bind
?
您的方法之间的区别在于 bind
传递更多参数,而不是仅使用 name
调用 sayHello
。在这种情况下,事件参数将传递给处理程序而不是被忽略。当然这可以修复(使用 arguments
对象或 ES6 rest+spread),但这只会使它变得更加复杂和容易出错。
这就是 imo 的主要缺点:它相当长但不必要地更长。我比较喜欢简洁