2011-03-29 203 views
0

我試圖做一個簡單的功能與js & jquery,但我無法得到它的工作。Javascript可變範圍

從我所瞭解的情況來看,當我聲明一個沒有var的變量時,它變成了全局變量,但我可以將一個變量從jquery回調函數傳遞給我的主函數。

function fetchEvents(start,end){ 
     ret = []; 
     $j.getJSON("index.php?page=agenda_google_ajax&action=list&start="+start+"&end="+end,function(data){ 
      console.log(data); // works ok 
      ret = data; 
     }); 
     console.log(ret); // equals [] :'(
     return ret; 
    } 
+0

你可能想閱讀javascript async – kjy112 2011-03-29 14:40:44

+0

ret變量是否需要數組? – yojimbo87 2011-03-29 14:41:38

回答

2

據我瞭解,當我聲明一個變量使用var成爲全球..

情況正好相反。當您省略var時,變量將變爲全局變量。始終使用var!

Google JavaScript Style Guide

當你失敗指定變種,該 變量被放置在全球背景下 ,可能重挫 現有值。另外,如果不存在 聲明,很難說明變量存在的範圍(例如,它可能容易地在文檔或窗口中,就像 ,就像在本地範圍中一樣)。所以 總是用var聲明。

至於你的問題console.log(ret); // equals [] :'( ...

$j.getJSON()不是同步的方法調用。該方法異步運行,因此您的代碼有效地說道:

ret = []; 
console.log(ret); 

如果您需要使用您的getJSON()返回的數據執行完成後,你可以調用你的回調函數中的一個方法:

$j.getJSON("index.php?page=agenda_google_ajax&action=list&start="+start+"&end="+end, 
    function(data){  // this is your callback function 
     console.log(data); // works ok 
     doSomething(data); // process the returned JSON 
    } 
}); 
+0

那不告訴我如何修復我的腳本... – 2011-03-29 14:40:44

+0

@Paté創建一個全局函數調用'test()'並在該函數內調用'console.log(ret)'現在在你的getJSON回調函數中調用'test()'並且看看你得到了什麼 – kjy112 2011-03-29 14:42:59

+0

@Paté - 我添加了一個代碼示例來演示如何使用返回的數據。 – McStretch 2011-03-29 14:49:54

0

嘗試加入VAR到var ret = [];

+0

它並沒有改變任何東西... – 2011-03-29 14:39:40

+0

@pate你需要讓你請求async:false – jimy 2011-03-29 14:42:51

+0

需要使用'.ajax'而不是'.getJSON'來設置'async:false' – kjy112 2011-03-29 14:47:16

0

向其添加var不會使其成爲全局變量,省略它會使其成爲全局變量,並將其添加到全局窗口對象中。

2

你的問題是$ .getJSON使用回調函數,所以當你調用fetchEvents函數時,它會在回調執行前返回。

你想要做的是在回調填充/做你想做的東西。

正如你所指出的console.log回調

1

工作正常好像你在這裏混淆2點的問題。

第一個是var沒有使變量gloabl。事實恰恰相反。這是省略var將使全局變量。

第二個是getJSON回調方法不會同步執行。它將在http請求完成後執行。因此,在撥打getJSON之後,不會期望ret將立即設置爲該值。

0

這是因爲在您從ajax獲得響應之前評估ret。嘗試

function fetchEvents(start,end){ 
     $j.getJSON("index.php?page=agenda_google_ajax&action=list&start="+start+"&end="+end,function(data){ 
      console.log(data); // works ok 
      var ret = data 
      whatsRet (ret); 
     }); 
     } 

function whatsRet (ret) { 
     console.log(ret); // equals data :) 
} 
0

你有問題是關於編寫異步代碼。

當您撥打getJSON時,內部函數將不會被調用,直到getJSON返回一些內容。這意味着代碼不再自上而下執行,即使getJSON仍在獲取數據,程序仍會繼續執行。

你應該提供的callback代替return

var fetchEvents = function (start, end, callback) { 
    $j.getJSON("index.php?start="+start+"&end="+end, function (data) { 
    callback(data); 
    }); 
}; 

// Now you can use fetchEvents which will be asynchronous too 
fetchEvents(0, 10, function (data) { 
    console.log(data); 
}) 

可以simpify fetchEvents事件更直接的傳遞給callbackgetJSON

var fetchEvents = function (start, end, callback) { 
    $j.getJSON("index.php?start="+start+"&end="+end, callback); 
}; 

PD:我簡化了查詢的可讀性。