zoukankan      html  css  js  c++  java
  • 闭包和柯里化

    闭包和柯里化都是JavaScript经常用到而且比较高级的技巧,所有的函数式编程语言都支持这两个概念,因此,我们想要充分发挥出JavaScript中的函数式编程特征,就需要深入的了解这两个概念,闭包事实上更是柯里化所不可缺少的基础。
           一、柯里化的概念
          在计算机科学中,柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由Christopher Strachey以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。在直觉上,柯里化声称“如果你固定某些参数,你将得到接受余下参数的一个函数”。所以对于有两个变量的函数yx,如果固定了y = 2,则得到有一个变量的函数2x。
          柯里化就是预先将函数的某些参数传入,得到一个简单的函数。但是预先传入的参数被保存在闭包中,因此会有一些奇特的特性。比如:

          var adder = function(num){
                return function(y){
                      return num + y;
                }
          }
          var inc = adder(1);
          var dec = adder(-1);
          这里的inc/dec两个变量事实上是两个新的函数,可以通过括号来调用,比如下例中的用法:
          //inc, dec现在是两个新的函数,作用是将传入的参数值(+/-)1
          print(inc(99));//100
          print(dec(101));//100
          print(adder(100)(2));//102
          print(adder(2)(100));//102
          二、柯里化的应用
          根据柯里化的特性,我们可以写出更有意思的代码,比如在前端开发中经常会遇到这样的情况,当请求从服务端返回后,我们需要更新一些特定的页面元素,也就是局部刷新的概念。使用局部刷新非常简单,但是代码很容易写成一团乱麻。而如果使用柯里化,则可以很大程度上美化我们的代码,使之更容易维护。我们来看一个例子:
          //update会返回一个函数,这个函数可以设置id属性为item的web元素的内容
          function update(item){
                return function(text){
                      $("div#"+item).html(text);
                }
          }
          //Ajax请求,当成功是调用参数callback
          function refresh(url, callback){
                var params = {
                      type : "echo",
                      data : ""
                };
                $.ajax({
                      type:"post",
                      http://www.html5china.com/js/jsadv/url,
                      cache:false,
                      async:true,
                      dataType:"json",
                      data:params,
                      //当异步请求成功时调用
                      success: function(data, status){
                            callback(data);
                      },
                      //当请求出现错误时调用
                      error: function(err){
                            alert("error : "+err);
                      }
                });
          }
          refresh("action.do?target=news", update("newsPanel"));
          refresh("action.do?target=articles", update("articlePanel"));
          refresh("action.do?target=pictures", update("picturePanel"));
          其中,update函数即为柯里化的一个实例,它会返回一个函数,即:
          update("newsPanel") = function(text){
                $("div#newsPanel").html(text);
          }
          由于update(“newsPanel”)的返回值为一个函数,需要的参数为一个字符串,因此在refresh的Ajax调用中,当success时,会给callback传入服务器端返回的数据信息,从而实现newsPanel面板的刷新,其他的文章面板articlePanel,图片面板picturePanel的刷新均采取这种方式,这样,代码的可读性,可维护性均得到了提高。

    原文来自 http://www.html5china.com/js/jsadv/20111120_2735.html

  • 相关阅读:
    【Elasticsearch 技术分享】—— ES 常用名词及结构
    【Elasticsearch 技术分享】—— Elasticsearch ?倒排索引?这都是什么?
    除了读写锁,JUC 下面还有个 StampedLock!还不过来了解一下么?
    小伙伴想写个 IDEA 插件么?这些 API 了解一下!
    部署Microsoft.ReportViewe
    关于TFS强制undo他人check out
    几段查看数据库表占用硬盘空间的tsql
    How to perform validation on sumbit only
    TFS 2012 Disable Multiple Check-out
    在Chrome Console中加载jQuery
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3233953.html
Copyright © 2011-2022 走看看