JavaScript库里:实际应用是什么?
我不认为我已经凝视了。我了解它的作用以及如何去做。我只是想不到一种情况,我会用它。
我们在JavaScript中的哪个地方使用currying(或者主要库在哪里使用它)?欢迎使用DOM操作或者一般应用程序开发示例。
答案之一是动画。像slideUp,fadeIn之类的函数将一个元素作为参数,通常是一个咖喱函数,它返回带有内置默认动画功能的高阶函数。为什么这比仅应用带有某些默认值的upper-up功能更好?
使用它有什么缺点吗?
根据要求,这里提供了一些有关JavaScript currying的良好资源:
- http://www.dustindiaz.com/javascript-curry/
- Crockford,Douglas(2008)JavaScript:优秀部分
- http://www.svendtofte.com/code/curried_javascript/(绕过ML,所以从ML速成班跳过整个部分,然后从如何编写咖喱JavaScript再次开始)
- http://blog.morrisjohns.com/javascript_closures_for_dummies
- JavaScript闭包如何工作?
- http://ejohn.org/blog/partial-functions-in-javascript(Resig先生照常付款)
- http://benalman.com/news/2010/09/partial-application-in-javascript/
当他们在评论中出现时,病态会增加更多。
因此,根据答案,通常使用currying和部分应用是便捷技术。
如果我们经常通过使用相同的配置来调用它来完善高级函数,则可以咖喱(或者使用Resigs部分)高级函数来创建简单,简洁的帮助器方法。
解决方案
至于使用它的库,总是有功能性的。
什么时候在JS中有用?它可能同时在其他现代语言中很有用,但是我唯一看到的是它与部分应用程序结合使用。
我想说,很可能,JS中的所有动画库都使用currying。不必每次调用都传递一组受影响的元素和一个函数(描述元素的行为方式),而是传递给一个高阶函数,以确保所有计时内容,通常,客户可以更容易地将其作为公共API发布。像" slideUp"," fadeIn"之类的函数,仅将元素作为参数,并且是一些咖喱函数,它们返回带有默认内置"动画功能"的高阶函数。
这不是魔术,也不是任何东西……只是匿名函数的令人愉快的简写。
partial(alert," FOO!"))等效于
function(){alert(" FOO!");}
partial(Math.max,0)对应于function(x){return Math.max(0,x);}。
对部分调用(MochiKit术语。我认为其他一些库为函数提供了一个.curry方法,该方法执行相同的功能)看起来比匿名函数好一些,噪音也较小。
我发现类似于python的functools.partial
的函数在JavaScript中更有用:
function partial(fn) { return partialWithScope.apply(this, Array.prototype.concat.apply([fn, this], Array.prototype.slice.call(arguments, 1))); } function partialWithScope(fn, scope) { var args = Array.prototype.slice.call(arguments, 2); return function() { return fn.apply(scope, Array.prototype.concat.apply(args, arguments)); }; }
我们为什么要使用它?想要使用this的常见情况是要将函数中的this
绑定到值时:
var callback = partialWithScope(Object.function, obj);
现在,当回调被调用时,this
指向obj
。这在事件情况下或者节省一些空间很有用,因为它通常会使代码更短。
Currying与Partialing类似,区别在于currying返回的函数只接受一个参数(据我所知)。
@汉克·盖伊
回应EmbiggensTheMind的评论:
我想不出一个实例,其中curryingby本身在JavaScript中很有用;它是一种将具有多个参数的函数调用转换为具有每个调用单个参数的函数调用链的技术,但是JavaScript在单个函数调用中支持多个参数。
在JavaScript中,我假设大多数其他实际语言(不是lambda演算)通常与部分应用程序关联。 John Resig对此进行了更好的解释,但要点是它具有一些适用于两个或者多个参数的逻辑,并且我们只知道其中一些参数的值。
我们可以使用部分应用程序/循环来修复那些已知值,并返回仅接受未知数的函数,稍后当我们实际拥有要传递的值时将调用该函数。当我们将一遍又一遍地使用相同的值(除了一个)来调用相同的JavaScript内置函数时,这提供了一种避免重复的好方法。窃取约翰的榜样:
String.prototype.csv = String.prototype.split.partial(/,\s*/); var results = "John, Resig, Boston".csv(); alert( (results[1] == "Resig") + " The text values were split properly" );
这是一个例子。
我正在使用JQuery来检测一堆字段,以便了解用户的需求。代码如下:
$('#foo').focus(trackActivity); $('#foo').blur(trackActivity); $('#bar').focus(trackActivity); $('#bar').blur(trackActivity);
(对于非JQuery用户,我是说,每当两个字段都失去焦点时,我都希望调用trackActivity()函数。我也可以使用匿名函数,但是我必须复制它4次,因此我将其拔出并命名。)
现在事实证明,这些字段之一需要以不同的方式处理。我希望能够在其中一个调用中传递参数,以传递给我们的跟踪基础结构。有了咖喱,我可以了。