javascript问题中的全局变量

时间:2014-03-20 07:43:49

标签: javascript jquery var

我是新手,必须回答以下问题:

我声明了一个全局变量并改变了函数中的值。但在价值之外仍然是旧的。

var allowDrag = 'false';

$.get('/cakeorga2/ajax/is_admin/', function (data) {
    allowDrag = data;
    console.log ('allowDrag in function : '+allowDrag);
});

console.log ('outside of the function : '+ allowDrag);

控制台日志是:

outside of the function : false
allowDrag in function : true

有什么建议吗?

6 个答案:

答案 0 :(得分:3)

$.get$.ajax的简写方法:

  

执行异步 HTTP(Ajax)请求。

ajax调用通常是异步的,因此主console.log将在$ .get执行完成之前触发(正如您在控制台命令中看到的那样),并且在那一刻allowDrag值为仍然是false

答案 1 :(得分:1)

你被困了。全局变量的行为与您预期的完全相同。它在第二个console.log中没有新值的原因是另一个:当您执行console.log时,使用$.get发出的ajax调用尚未得到答复。如果您需要像这样使用它,则必须使用async: false选项使呼叫同步。

答案 2 :(得分:1)

使用deferred.then()仅在更新值后调用第二个console.log()(ajax GET成功)

$.get('/cakeorga2/ajax/is_admin/', function (data) {
  allowDrag = data;
  console.log ('allowDrag in function : '+allowDrag);
}).then( function(){
     console.log ('outside of the function : '+ allowDrag);
   }
);

http://api.jquery.com/deferred.then/

答案 3 :(得分:1)

这是因为ajax来电是asynchronous。异步(在您的使用案例中)意味着您的outside of the function console.log将在ajax调用返回之前执行。

答案 4 :(得分:1)

那很可能是因为函数外部的console.log在函数内部之前被调用,因为你必须自己调用函数并且它周围的代码会自动“播放”。但由于我不熟悉Ajax / jQuery,我可能错了。

答案 5 :(得分:1)

$。ajax()

同步
var allowDrag = 'false';

allowDrag  = $.ajax(
              {
               url:'/cakeorga2/ajax/is_admin/',
               async:false
              }).responseText;

console.log ('outside of the function : '+ allowDrag);