[removed] Is it possible to pass a variable into a callback function that is assigned to a variable?

后端 未结 5 784
谎友^
谎友^ 2020-12-11 00:38

A lot of people say that this is asked too much in the comments, which made me hesitant to ask this, but I still have not found a solution in their answers, mostly because (

相关标签:
5条回答
  • 2020-12-11 01:15

    You can create a function like this

    var c="hello";
    
    (function(b){
       alert(b) 
    })(c);
    

    result would be "hello"

    0 讨论(0)
  • 2020-12-11 01:28

    Just don't declare that variable as a parameter in your anonymous function, like this:

    function iClick(this)
    {
        var foo = "I would like to pass this.";
        ajax.onreadystatechange = function () { alert(foo); }
    }
    

    When you call the first parameter foo it's whatever's calling that callback passes in that's foo inside the function. If you want to reference a previously declared variable just do that, make sure not to use a parameter with the same name.

    0 讨论(0)
  • 2020-12-11 01:32

    You can also do this, but maybe it's not necessary:

    function iClick(this)
    {
        var foo = "I would like to pass this.";
    
        ajax.onreadystatechange = (function(thevar) {
            return function () { alert(thevar); };
          })(foo);
    }
    
    0 讨论(0)
  • 2020-12-11 01:32

    As @John Hartsock referred, the answer that everyone should really remember is this

    var c="hello";
    
    (function(b){
       alert(b) 
    })(c);
    

    And that's very important for example in a for loop when there is some async function inside it, because otherwise you don't get the correct item.

    Tell me, what comes out from here?

    for (var i=0; i<5; i++){
      setTimeout(function(){ 
        console.log(i); 
        }, 1000);
    }

    Exactly: all 5, because when all the timers are triggered after 1 second, variable i is already at the value 5.

    But if you use a self-invoked anonymous function (SIAF) like this

    for (var i=0; i<5; i++){
      (function (j){
        setTimeout(function(){ 
          console.log(j); 
          }, 1000);
       })(i);
    }

    it does work, since every time the function is evoked, it runs another instance of the function and as any function, it has its own local variables. I do not merely define the function, I also run it right away (through the (); at the end), but then internally a new instance of the function will be created with different internal local variables, as I parse to the function a different variable every time I run it.

    0 讨论(0)
  • 2020-12-11 01:32

    I belive you wanted something like that

    function handleAjaxRequest(params) {
        var context = {'b':'inner', 'c': params['c']};
        function rendered(html) {
          // render
        }
        function gotPart(part) {
            context['a'] = part;
            engine.render(context).addCallback(rendered);
        }
        ajax.getPart(params).addCallback(gotPart);
    }
    
    0 讨论(0)
提交回复
热议问题