JavaScript作用域问题

3

我正在尝试让这个函数正常工作。我认为这个函数相当自解释:

function FileExists(path){
    var result = false;

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

    return result;
}

我需要一个匿名函数,在ajax post成功后调用,将在FileExists函数内定义的变量“result”设置为true,以便我可以从FileExists函数中返回该值。我认为我需要使用闭包来实现这一点,但它们让我非常困惑。
请帮忙! 谢谢!
2个回答

3

这不是一个作用域问题,而是因为$.ajax是异步的,意味着FileExists将在$.ajax完成之前return。你应该将所有依赖于result的代码移动到success回调函数中。


但是他关于闭包的问题提出了一个很好的观点,没有使用 var 前缀的任何赋值都会分配到全局命名空间中,如果这样,他在匿名函数中的 result=true 是否分配给全局? - philwinkle
@philwinkle 不是匿名函数在创建它们的函数作用域中运行吗?可以看一下这个简单的测试用例:http://jsfiddle.net/txWLj/ 引擎通过每个作用域向上查找变量,直到达到全局作用域。 - Yi Jiang

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,它主要是懒程序员的一种替代方式,鉴于它的影响。 - Yi Jiang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接