2011-03-06 104 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