2012-01-06 5 views
2

Может кто-нибудь объяснить это, пожалуйста?Переменные внутри вложенных анонимных функций в javascript

  1. Почему бдительные 2 выскакивает перед оповещения 1?
  2. Почему значение PAGECOUNT в оповещения 1 отличается от предупреждения 2?
function naviSet() 
{ 
    var pageCount; 
    if($.ajax({ 
     type: "POST", 
     url: "http://localhost/mywebsite/wp-content/themes/twentyeleven/more-projects.php", 
     success:function(data) 
     { 
      pageCount = data; 
      alert(pageCount); //alert 1 
      return true; 
     }, 
     error:function() 
     { 
      $("#direction").html("Unable to load projects").show(); 
      return false; 
     } 
    })) alert(pageCount); //alert 2 
} 
+0

сог его asnc вызова Калима .. :) –

ответ

1

Почему тревога 2 выскакивает перед тем начеку 1?

Alert 1 запускается функцией обратного вызова, которая запускается при получении успешного ответа HTTP.

Alert 2 срабатывает, как только будет отправлен запрос HTTP.

Сети работают медленно.

Зачем стоит значение pageCount в предупреждении 1 отличается от предупреждения 2?

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

+0

Это не имеет ничего общего с медленными сетями, но с одной нити природы JavaScript. Событие с нулевым сетевым временем не может быть вызвано перед alert2. –

2

Предупреждение1 находится внутри обратного вызова - эта функция вызывается только тогда, когда запрос ajax завершается успешно (т.е. асинхронно).

С другой стороны, страница «Таблица» отличается по той же причине - обратный вызов успеха не был выполнен, когда вызывается alert2.

1

Функция ajax извлекает данные с данного URL асинхронно. Это означает, что он делает это в фоновом режиме, в то время как остальная часть вашего кода выполняется. Как только он будет завершен, функция, назначенная «успеху», вызывается (или «ошибка», если она терпит неудачу).

Второе предупреждение называется первым из-за этого. Как я уже сказал, остальная часть кода продолжает выполнение, пока работает функция ajax.

1

Причина, по которой происходит второе предупреждение, заключается в том, что вызов ajax является асинхронным. Он по существу планирует веб-вызов и немедленно возвращается. Следовательно, строка после нее, которая является вторым предупреждением, происходит сразу после.

В какой-то момент позже веб-запрос завершится и вызовет функцию success. Следовательно, первое предупреждение происходит в этой точке

2

Как большинство ответов упоминает, что вы делаете асинхронный вызов, но на самом деле это не причина. Таким образом, JavaScript является однопоточным, только на мысли можно сделать за раз.

Итак, сначала вы вызываете свою функцию, и эта функция помещается в стек контекста выполнения. Эта функция будет выполнена до того, как любая другая функция, которая будет добавлена ​​в стек, может быть выполнена.В этой функции вы делаете свой вызов ajax, и при успешном выполнении функция успеха будет помещена в стек контекста выполнения. Таким образом, эта функция никогда не вызывается до naviSet. Поскольку alert1 выполняется в функции naviSet, он будет вызван первым.

А ваш второй вопрос:

С вашей функции я думаю, что вы верите, когда $.ajax() возвращается true, ваш Ajax вызов был успешным и pageCount был установлен в данные. Но это не так. $.ajax не возвращает true, но значение trueeth $. Его функция возвращает ссылку на главный объект jquery, поэтому вы можете цеплять вызовы функций.

функция NaViSet()

{ 
    //you create a new var which is undefined 
    var pageCount; 
    // return $ which is a truethy in JavaScript, but it does not mean the ajax call was successful 
    if($.ajax({ 
     type: "POST", 
     url: "http://localhost/mywebsite/wp-content/themes/twentyeleven/more-projects.php", 
     success:function(data) 
     { 
      // now you in the context of your success function 
      // and set the value of your variable to data 
      pageCount = data; 
      alert(pageCount); //alert 1 
      return true; 
     }, 
     error:function() 
     { 
      $("#direction").html("Unable to load projects").show(); 
      return false; 
     } 

    })) 
    //here you are still in the context of your naviSet function where pageCount is undefined 
    alert(pageCount); //alert 2 
} 
Смежные вопросы