JavaScript: возможно ли передать переменную в функцию обратного вызова, которая назначена переменной? - PullRequest
17 голосов
/ 16 октября 2010

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

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

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

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

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

Ответы [ 5 ]

24 голосов
/ 16 октября 2010

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

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

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

16 голосов
/ 16 октября 2010

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

var c="hello";

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

результат будет "привет"

3 голосов
/ 16 октября 2010

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

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

    ajax.onreadystatechange = (function(thevar) {
        return function () { alert(thevar); };
      })(foo);
}
1 голос
/ 13 января 2018

Как говорил @Джон Хартсок, ответ, который все должны помнить, таков:

var c="hello";

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

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

Скажи мне, что выходит отсюда?

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

Точно: все 5, потому что когда все таймеры срабатывают через 1 секунду, переменная i уже имеет значение 5.

Но если вы используете анонимную функцию, вызываемую самостоятельно (SIAF), как это

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

он работает, так как каждый раз, когда вызывается функция, он запускает другой экземпляр функции и, как любая функция, имеет свои собственные локальные переменные. Я не просто определяю функцию, я также запускаю ее сразу (через (); в конце), но затем внутренне создается новый экземпляр функции с различными внутренними локальными переменными, когда я анализирую функцию a разные переменные каждый раз, когда я запускаю его.

0 голосов
/ 16 октября 2010

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

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...