2011-03-06 174 views
3

我試圖讓這個函數起作用。我認爲,功能是非常強的自我explanitory:Javascript範圍問題

function FileExists(path){ 
    var result = false; 

    $.ajax({ 
     url: "http://mydomain.com/"+path, 
     type: "HEAD", 
     success: 
       function(){ 
        result = true; 
       } 
    }); 

    return result; 
} 

我需要的是在阿賈克斯後的成功調用設置是在FILEEXISTS函數內部定義爲真正的變量「結果」的匿名函數,這樣我可以從FileExists函數返回該值。我想我需要一個關閉,但他們混淆了我的地獄。

請幫忙! 謝謝!

回答

2

Ajax調用默認情況下是異步的,你可以使用一個回調函數:

$.ajax({ 
    url: "http://mydomain.com/"+path, 
    type: "HEAD", 
    success: function(){ 
     callback(true); 
    } 
}); 

或者撥打電話同步。

$.ajax({ 
    async: false, 
    url: "http://mydomain.com/"+path, 
... 
+1

幾乎沒有理由可以使用'async:false';它主要是懶惰的程序員的柺杖,因爲它的效果。 – 2011-03-06 05:53:34

3

這不是一個範圍問題,而是因爲$.ajax是異步的,這意味着FileExists$.ajaxreturn將完成。你應該做的是將所有依賴於result的代碼移到success回調中。

+0

但是他關於關閉的問題提出了一個好的觀點,如果沒有'var'在它之前賦值給全局命名空間,沒有任何賦值?如果是這樣,他的anon func中的'result = true'賦予全局? – philwinkle 2011-03-06 05:44:26

+0

@philwinkle不,不。函數運行在創建它們的函數的範圍中。看到一個簡單的測試用例,例如:http://jsfiddle.net/txWLj/引擎遍歷每個範圍尋找變量,直到達到全局範圍。 – 2011-03-06 05:51:30