2011-11-04 46 views
-1

我想在成功函數的testarray中添加值。我需要在測試函數中返回數組,因爲我在腳本中調用了這個函數。 問題是當我調用測試函數時數組保持空白。我該如何解決這個問題?全局數組保持爲空

function test() 
    { 
     var testarray=new Array(); 

     function success() 
     { 

      testarray.push("test1"); 
     } 

     return testarray; 
    } 
+2

看起來好像你曾經*調用*成功函數,所以你期望什麼? – deceze

+0

您的問題已被回答?如果不;爲什麼不? – PPvG

回答

0

你的問題是你只聲明success()函數,從不執行它。雖然功能並沒有太大的意義對我來說,你可以嘗試更換你的函數:

(function(){ 
    testarray.push("test1"); 
})(); 

將定義一個新的匿名函數,並立即調用它。

+0

對不起,但沒有寫完整的代碼。我稱之爲成功withvar directoryReader = fileSystem2.createReader(); directoryReader.readEntries(成功,失敗); – michael643

+1

@ michael643 - 那麼你真的需要提供一個更好的例子,因爲我不知道你實際上想要達到什麼。 –

1

在您的代碼中沒有success的調用。這就是testarray保持空白的原因。

如果您異步調用success,則testarray的值將僅在success完成稍後時間點的執行時纔會更新。

要檢查,你可以做到這一點

function test() 
{ 
    var testarray=new Array(); 
    function success() 
    { 
     testarray.push("test1"); 
     console.log(testarray); //prints ["test1"] 
    } 
    return testarray; //testarray is empty here because success has not yet finished. 
} 
+0

我很抱歉,但沒有寫完整的代碼。我稱之爲成功withvar directoryReader = fileSystem2.createReader(); directoryReader.readEntries(成功,失敗); – michael643

+0

@ michael643如果你異步地調用'success',只有當'success'執行完成而不是'test'執行完成時,數組纔會被填充。 –

0

你必須呼叫成功的功能。

function test() { 
    var testarray = new Array(); 

    function success() { 
     testarray.push("test1"); 
    } 

    success(); 
    success(); 
    success(); 
    return testarray; 
} 
0

我不是100%確定問題的原因,但它可能與你從哪裏調用它有關。如果你想,你可以在全球範圍調用的實現通過出你的腳本試試這個:

var test = 
{ 
    'testarray': new Array(), 

    'success': function() 
    { 

     this.testarray.push("test1"); 
    }, 

    'getArray': function() { 
     return this.testarray; 
    } 
} 

您可以打電話給你的成功的功能與線:

test.success(); 

,並獲得數組中任何你想要的點:

test.getArray(); 

在這個實現中,測試只是一個變量,它包含一個對象。一個對象存儲無序的鍵:值對,並且該值可以是一個對象,一個匿名函數以及幾乎任何其他數據類型。所以'testarray','success'和'getArray'是鍵,它們的值在冒號後面。您可以使用點符號訪問這些密鑰,所以您可以實際說

test.testarray; 

可以從腳本中的任何位置直接指向您的數組。

0

Narendra said類似,您目前尚未修改它return testarray,因爲功能success()尚未被調用。既然你沒有給我們更多的上下文,我會假設你正在做一些簡單的事情,所以我可以給你一個簡單的答案。讓我們假設你想要做這樣的事情:

for (testElement in test()) { 
    console.log(testElement); 
} 

現在,你還指望test()返回一些成果,但它返回一個空Array,所以什麼也沒發生。

爲了解決這個問題,你可以通過你要一起測試功能做一個函數,像這樣的內容:

function test(callback) { 
    var testarray=new Array(); 
    function success() { 
     testarray.push("test1"); 
     // Call the callback function: 
     callback(testarray); 
    } 
} 

myCallback = function(resultArray) { 
    for (testElement in resultArray) { 
     console.log(testElement); 
    } 
} 

test(myCallback); 
// After some time... 
// console: test1 

好了,現在它的工作原理。我們已經定義了一個將被調用的回調函數,一旦異步代碼完成,testarray作爲參數。但是,它可能仍然無法做你想做的,因爲它只能使用一次:

test(myCallback); 
test(myCallback); 
// After some time... 
// console: test1 
// console: test1 

你再打電話test()的那一刻,它會創建一個新的空數組,當sucess()叫,推"test1"到它。這可能不是你想要的(否則,你爲什麼會用array?)

那麼,我們該如何解決這個問題呢?好了,我們只取陣列出來的功能,如:

function test(testarray, callback) { 
    function success() { 
     testarray.push("test" + (testarray.length+1)); 
     callback(testarray); 
    } 
} 

myCallback = function(resultArray) { 
    for (testElement in resultArray) { 
     console.log(testElement); 
    } 
} 

myTestArray = new Array(); 

test(myTestArray, myCallback); 
test(myTestArray, myCallback); 
test(myTestArray, myCallback); 
// After some time... 
// Console: test1 
// Console: test1 
//   test2 
// Console: test1 
//   test2 
//   test3 

這適用於同樣的原因,testarray是提供給在首位的功能success():,因爲JavaScript在創建一個「封閉」變量。這意味着因爲該變量是在內部函數中引用的,所以在外部函數返回後很長時間內它仍然可以在內部函數中使用。

我希望這會有所幫助。 :)