zoukankan      html  css  js  c++  java
  • bind&currying

    1. bind

    • 基本用法

      bind()是ECMAScript5中新增的方法,这个方法主要作用是将函数绑定至某个对象。当在函数f()上调用bind()方法并传入一个对象o作为参数,这个方法将返回一个新函数,这个新函数与原函数f()的区别仅仅是this参数指向了一个特定对象o。

      实例如下:

    function f(y){
        return this.x + y;  
    }
    var obj = {x: 1};
    var newFun = f.bind(obj);
    newFun(2);//=>3

      模拟基本用法:

    if(!Function.prototype.bind){
        Function.prototype.bind = function(/*o*/){
            var obj = arguments[0];
            var selfFun = this;
            return function(/*args*/){
                return selfFun.apply(obj, arguments);
            };
        };
    }
    function f(y){return this.x + y}
    var obj = {x: 1};
    var newFun = f.bind(obj);
    console.log(newFun(2));//=>3
    • currying

      什么是柯里化?如果你固定一个函数的某些参数,将得到接受余下参数的一个新函数。ECMAScript5中得bind()方法不仅仅能够将某个函数中的this绑定至特定对象,还可以将函数的形参绑定到特定值。bing()的这种应用方式成为柯里化(curring)。

      例子如下:

    var sum = function(x, y){return x + y + this.z};
    var obj = {z: 1};
    var newFun = sum.bind(obj, 1);
    console.log(newFun(1));//=>3

      模拟currying用法:

    if(!Function.prototype.bind){
        Function.prototype.bind = function(/*o, args*/){
            //保存要绑定的函数
            var selfFun = this;
            //保存绑定的实参
            var obj = arguments[0];//将第一个参数绑定到this
            var boundArgs = arguments;//将后面的参数绑定到函数的前面几个参数
    
            //bind方法返回一个函数(闭包)
            //这个闭包要访问外部函数中的selfFun, boundArgs, obj.
            return function(/*argsLeft*/){
                var args = [];//创建实参数组
                var i;
                for(i = 1; i < boundArgs.length; i++){//push绑定的实参
                    args.push(boundArgs[i]);
                }
                for(i = 0; i < arguments.length; i++){//push剩余实参
                    args.push(arguments[i]);
                }
                //闭包内要访问外部函数内定义的变量
                return selfFun.apply(obj, args);
            };
        }
    }
    
    function sum(x, y){return x + y + this.z};
    var obj = {z: 1};
    var newFun = sum.bind(obj, 1);
    console.log(newFun(1));//=>3

      

  • 相关阅读:
    bzoj 1012: [JSOI2008]最大数maxnumber 线段树
    Codeforces Round #260 (Div. 2) A , B , C 标记,找规律 , dp
    Codeforces Round #256 (Div. 2) E. Divisors 因子+dfs
    Codeforces Round #340 (Div. 2) E. XOR and Favorite Number 莫队算法
    Codeforces Round #348 (VK Cup 2016 Round 2, Div. 1 Edition) C. Little Artem and Random Variable 数学
    BZOJ 1005 [HNOI2008]明明的烦恼 purfer序列,排列组合
    BZOJ 1211: [HNOI2004]树的计数 purfer序列
    UVA 1629 Cake slicing 记忆化搜索
    UVA1630 Folding 区间DP
    BNU 51640 Training Plan DP
  • 原文地址:https://www.cnblogs.com/iamswf/p/4762745.html
Copyright © 2011-2022 走看看