2016-09-17 70 views
0

我已阅读关于此主题的一些其他问题,许多人说如果我在我的函数之外声明变量varA(在全局范围内),它是一个全局函数,所以它可以被任何函数使用和更新,对吗?无法更新函数内部的全局变量并将其称为外部函数(jQuery)

现在,我有这个例子,我在函数外声明一个变量,在函数内部改变它,但是当我在函数外调用它时,它显示为undefined,如果我要在函数内部调用它它被改变了。

$(document).ready(function() { 

    var varA; 

    $(function() { 

     varA = 'varA has been altered!'; 

     alert(varA); //displays 'varA has been altered!' 

    }); 

    alert(varA); //displays 'undefined' 
}); 

这似乎并不符合逻辑的我,当我改变了一个全局变量,应该不是第二alert();显示varA价值?

什么是解决此问题的方法?我怎样才能改变一个函数内的全局变量,并获得该函数之外的值?

干杯

编辑:

我需要能够访问varA在一个以上的功能,所以它需要前$(function() {});

回答

2

要声明的问题是,有一个竞争条件访问varA:如果$(function() {});以下的代码在函数内部的代码之前运行,那么它将不会被定义。

在这种情况下,$(document).ready()$()是一样的,所以document应该已经在函数内准备好了。因此,你可以只运行

$(function() { 
    var varA; 

    varA = 'varA has been altered!'; 
    alert(varA); //displays 'varA has been altered!' 
}); 

这是不是与范围界定问题:在这里的作用域是类似的例子,但比赛情况消除,所以代码将工作:

$(function() { 
    var varA; 
    var def = $.Deferred(); 
    def.then(function() { 
     varA = 'varA has been altered!'; 
    }).then(function() { 
     alert(varA); //displays 'varA has been altered!' 
    }); 

    def.resolve(); 
}); 
+0

由于'varA'是在函数内声明的,它仍然可以在全局范围内访问吗?我可以在功能外使用它吗? –

+0

不,你不能,因为变量被绑定到函数作用域。如果您想在功能之外访问它,请在外部声明。 – mc10

+0

当我在函数上面声明'varA'时,它仍然显示为未定义的('var varA; $(function(){...})') –

0

由于@ mc10提到这主要是由于访问varA的竞争条件。发生这种情况的原因是$(document).ready()在调用回调之前等待readystatechange事件触发,因为它还运行setTimeOut以检查readystatechange事件是否已经触发。

因此,任何这样的代码:

$(document).ready(function(){ 
    a(); 
    $(b); 
    c(); 
}); 

将按顺序

  1. 一个

  2. Ç

  3. b

执行
0

默认情况下,javascript变量的值为'undefined',直到它们被赋值为止。在这种情况下,你的内部函数不会首先获得执行,并且alert将首先执行,并且在那个时候变量的值是'undefined',所以你会得到相同的结果。

为了避免这种情况,您可以尝试以下方法。

 $(document).ready(function() { 

     var varA; 

     (function() { 

      varA = 'varA has been altered!'; 
      console.log(varA); //displays 'varA has been altered!' 

     }()); 
     console.log(varA); //displays 'varA has been altered!' 
    });