How to bind function arguments without binding this?

前端 未结 15 906
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-30 07:25

In Javascript, how can I bind arguments to a function without binding the this parameter?

For example:

//Example function.
var c = funct         


        
相关标签:
15条回答
  • 2020-11-30 07:42

    Simple like that?

    var b = (cb) => obj.c(1,2,3, cb)
    b(function(){}) // insidde object
    

    More general solution:

    function original(a, b, c) { console.log(a, b, c) }
    let tied = (...args) => original(1, 2, ...args)
    
    original(1,2,3) // 1 2 3
    tied(5,6,7) // 1 2 5

    0 讨论(0)
  • 2020-11-30 07:44

    Why not use a wrapper around the function to save this as mythis ?

    function mythis() {
      this.name = "mythis";
      mythis = this;
      function c(a, b) {
        this.name = "original";
        alert('a=' + a + ' b =' + b + 'this = ' + this.name + ' mythis = ' + mythis.name);
        return "ok";
      }    
      return {
        c: c
      }
    };
    
    var retval = mythis().c(0, 1);
    
    0 讨论(0)
  • 2020-11-30 07:46

    An anonymous user posted this additional info:

    Building on what has already been provided in this post -- the most elegant solution I've seen is to Curry your arguments and context:

    function Class(a, b, c, d){
        console.log('@Class #this', this, a, b, c, d);
    }
    
    function Context(name){
        console.log('@Context', this, name);
        this.name = name;
    }
    
    var context1 = new Context('One');
    var context2 = new Context('Two');
    
    function curryArguments(fn) {
        var args = Array.prototype.slice.call(arguments, 1);
        return function bindContext() {
          var additional = Array.prototype.slice.call(arguments, 0);
          return fn.apply(this, args.concat(additional));
        };
    }
    
    var bindContext = curryArguments(Class, 'A', 'B');
    
    bindContext.apply(context1, ['C', 'D']);
    bindContext.apply(context2, ['Y', 'Z']);
    
    0 讨论(0)
  • 2020-11-30 07:47

    Use a protagonist!

    var geoOpts = {...};
    
    function geoSuccess(user){  // protagonizes for 'user'
      return function Success(pos){
        if(!pos || !pos.coords || !pos.coords.latitude || !pos.coords.longitude){ throw new Error('Geolocation Error: insufficient data.'); }
    
        var data = {pos.coords: pos.coords, ...};
    
        // now we have a callback we can turn into an object. implementation can use 'this' inside callback
        if(user){
          user.prototype = data;
          user.prototype.watch = watchUser;
          thus.User = (new user(data));
          console.log('thus.User', thus, thus.User);
        }
      }
    }
    
    function geoError(errorCallback){  // protagonizes for 'errorCallback'
      return function(err){
        console.log('@DECLINED', err);
        errorCallback && errorCallback(err);
      }
    }
    
    function getUserPos(user, error, opts){
      nav.geo.getPos(geoSuccess(user), geoError(error), opts || geoOpts);
    }
    

    Basically, the function you want to pass params to becomes a proxy which you can call to pass a variable, and it returns the function you actually want to do stuff.

    Hope this helps!

    0 讨论(0)
  • 2020-11-30 07:50

    May be you want to bind reference of this in last but your code:-

    var c = function(a, b, c, callback) {};
    var b = c.bind(null, 1, 2, 3); 
    

    Already applied binding for instance this and later you can not change it. What I will suggest that use reference also as a parameter like this:-

    var c = function(a, b, c, callback, ref) {  
        var self = this ? this : ref; 
        // Now you can use self just like this in your code 
    };
    var b = c.bind(null, 1, 2, 3),
        newRef = this, // or ref whatever you want to apply inside function c()
        d = c.bind(callback, newRef);
    
    0 讨论(0)
  • 2020-11-30 07:50

    Using LoDash you can use the _.partial function.

    const f  = function (a, b, c, callback) {}
    
    const pf = _.partial(f, 1, 2, 3)  // f has first 3 arguments bound.
    
    pf(function () {})                // callback.
    
    0 讨论(0)
提交回复
热议问题