在事件上使用Javascript闭包来定义单击事件的优点

在事件上使用Javascript闭包来定义单击事件的优点,javascript,Javascript,在Javascript中,我看到了以下两种方式编写的代码: A. SomeObject.prototype.hideElement = function(e, element){ e.stopPropagation(); hide(element); } B. SomeObject.prototype.hideElement = function(element){ return function(e){ e.stopPropagation();

在Javascript中,我看到了以下两种方式编写的代码:

A.

SomeObject.prototype.hideElement = function(e, element){
    e.stopPropagation();
    hide(element);
}
B.

SomeObject.prototype.hideElement = function(element){
    return function(e){
        e.stopPropagation();
        hide(element);
    }
}

使用
A
B
相比有什么好处?什么时候一个比另一个更相关?

这条评论太长了

我并不是想居高临下(我也不是落选者之一)。我的意思是,对于任何试图使用它们的人来说,第一个函数不能作为事件处理程序直接连接,而第二个函数返回一个可以连接的函数。他们甚至不以相同的顺序接受他们的论点或返回相同的东西。从类型的角度考虑可能会有所帮助:

// option1 :: (Event, HTMLElement) -> Undefined
// option2 :: HTMLElement -> Event -> Undefined
要翻译,option1是一个函数,它接受一个元组(Event,HTMLElement)并返回未定义的值。Option2是一个函数,它接受HtmleElement并返回一个接受事件并返回未定义的函数

查看类型签名可以很明显地看出,尽管这些函数都隐藏了HtmleElement,但它们不能以相同的方式使用。查看JavaScript事件处理程序的签名:

// handler :: Event -> *
*
表示任何类型时,我们从上面的类型签名中看到,只有选项2,HtmleElement->事件->未定义的,适用

现在我们进入了舆论领域(我假设基于舆论的方面是你被否决的部分原因),但我认为第二个版本比第一个更好。因为第一个不能直接作为事件处理程序工作,而是将事件作为参数,这意味着它必须由事件处理程序调用并传入事件。在JS中,传递事件对象通常是一种反模式

第二个版本也更好(同样是IMHO),因为:它可以导致代码重用:

var someElement = document.getElementById('some-element');
var hider = option2(someElement); // remember, returns a function
var button = document.getElementById('hide-button');
button.addEventListener('click', hider);
button.addEventListener('keydown', hider); // accessibility handler, note reuse
如果有多个元素的交互作用导致“某些元素”被隐藏,该怎么办?希望您开始看到这里的有用性


作为对你上面消极攻击性评论的最后一点说明,有时候你会问一个在你看来非常明智的问题,但你遗漏了一些东西。回想起来,这让答案有些明显。或者你认为有一个客观的答案,但实际上是基于观点的(因此不适合这样)。人们会投反对票/发表评论。这是常有的事。别把它当回事。编程很难,我们都会犯错误。试着将反馈的内容与其情绪影响分开,后者不太可能对你有任何好处。

你是否尝试过使用它们?它们有两种截然不同的作用。回答得好。你用什么语法来表示函数型符号?@Pavlo有点像辛德雷•米尔纳。“::”的意思是“有类型”,箭头表示函数等。我用这种方式注释我的大部分JS代码,作为一种精神上的帮助,特别是当我在做了3个月的其他事情后回到它的时候。另外,两个参数和tuple不一样。@Pavlo是正确的,但我是从一个普遍使用的环境中借用了一种符号。我的意思是,它们是一个概念单元,而不是一个数据结构。