2016-09-17 22 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!' 
    }); 
相關問題