2012-11-11 81 views
3

我有一個文件,下面的代碼:未用var聲明的JavaScript變量是否變爲全局變量?

function refreshGridSuccess(responseText, entity) { 

    oTable = $('#dataTable').dataTable({ 
     "sScrollX": "100%", 

在另一個文件中,我有:

$('#detailData') 
     .on('click', '.sort-up', function (event) { 
      event.preventDefault(); 
      var column = $(this).closest('th'), 
       columnIndex = column.parent().children().index(column.get(0)); 
      oTable.fnSort([[columnIndex, 'asc']]); 
      return false; 
     }) 

我沒有定義oTable除了這裏。腳本似乎工作,那麼這意味着oTable以某種方式成爲全局變量?

現在我想開始使用Typescript,它不會接受Otable而不會聲明它。有沒有辦法可以聲明oTable作爲對象,還是我必須將其聲明爲與$('#dataTable').dataTable({})返回的對象類型相同?

+0

爲了解決這個問題,你需要明確地把var oTable放在你的TypeScript中。在你的情況下,兩種用法都可以訪問。 – Fenton

回答

2

是,不使用var聲明的變量成爲全球性的。當在函數範圍之外使用時,不一定需要,但是,使用函數中定義的全局定義變量會導致不可預知的結果。

「在這些情況下未能聲明變量很可能會導致意外的結果。因此,在ECMAScript 5嚴格模式下,爲函數內部的未聲明變量賦值會引發錯誤。 - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/var

1

你是對的。沒有var聲明的變量被視爲全局變量。如果您在瀏覽器中,則該範圍爲window

另請注意,Javascript變量是函數範圍的。如果你有這樣的代碼含義:

function test() 
{ 
    for (var key in someObject) 
    { 
     var foo = 'bar'; 
    } 
} 

這是相同的:

function test() 
{ 
    var foo, key; 
    for (key in someObject) 
    { 
     foo = 'bar'; 
    } 
} 

不要緊,阻斷了var聲明被放置在,實際申報情況開頭的功能。如果你想谷歌它也被稱爲variable hoisting

現在約Typescript,我沒有機會玩它。但是我認爲在使用變量之前你仍然可以使用var oTable;