JavaScript: Можно ли передать переменную в функцию обратного вызова, назначенную переменной?

Многие говорят, что в комментариях это слишком много, что заставило меня не решаться спросить об этом, но я все еще не нашел решения в своих ответах, главным образом потому, что (1) они обычно используют jQuery и ( 2) вопросы обычно содержат технические вопросы, которые я не понимаю.

У меня есть функция с переменной внутри. Переменной присваивается функция. Я уверен, что эта концепция не является исключительной для AJAX, но это контекст, в котором я его использую, если это имеет значение.

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

    ajax.onreadystatechange = function (foo) { alert(foo); }
}

Я хочу передать переменную в функцию. Однако, поскольку нет оригинального объявления функции, как указать параметры? Могу ли я это сделать?

Ответы

Ответ 1

Просто не объявляйте эту переменную как параметр в вашей анонимной функции, например:

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

Когда вы вызываете первый параметр foo, он вызывает вызов, вызывающий этот обратный вызов в этом foo внутри функции. Если вы хотите ссылаться на ранее объявленную переменную, просто сделайте это, убедитесь, что вы не используете параметр с тем же именем.

Ответ 2

Вы можете создать такую ​​функцию, как

var c="hello";

(function(b){
   alert(b) 
})(c);
Результатом

будет "привет"

Ответ 3

Вы также можете это сделать, но, возможно, это не нужно:

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

    ajax.onreadystatechange = (function(thevar) {
        return function () { alert(thevar); };
      })(foo);
}

Ответ 4

Я верю, что вы хотели чего-то подобного

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);
}

Ответ 5

Как сказал @John Hartsock, ответ, который каждый должен запомнить, - это

var c="hello";

(function(b){
   alert(b) 
})(c);

И это очень важно, например, в цикле for, когда внутри него есть некоторая функция async, потому что в противном случае вы не получите правильный элемент.

Скажи мне, что здесь происходит?

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