Javascript - 为什么方法变量在回调中存活?

时间:2011-10-05 18:42:50

标签: javascript

假设你有[Fiddle]

function TestMethod() {
    var lifespan = "blah";

    $.ajax({
        url: "http://www.google.com",
        success: function (data) {
            alert(lifespan);
        },
        error: function (errorData) {
            alert(lifespan);
        },
        dataType: 'html'
    });
}

为什么回调触发时lifespan仍然存在?通过异步调用还能持续什么?是什么允许这种情况发生,是否存在某种“运行时”,如果你愿意的话,在javascript中使代码在进程中保持活动状态?如果是这样,什么时候才知道何时开始让内存物品死掉?

3 个答案:

答案 0 :(得分:5)

Javascript具有函数范围,而不是块范围(大括号),如C,C ++,C#,PHP和Java。

这是jsFiddle示例 -

http://jsfiddle.net/Wrz6X/

答案 1 :(得分:4)

您需要阅读有关javascript闭包的内容。嵌入函数范围内的所有变量(无论是否在父函数中声明)都保持可用,直到对函数内部闭包的所有引用都执行完毕。

由于我最初是一名C / C ++开发人员,我认为它就像堆栈帧的垃圾收集一样。当函数执行完毕时,任何函数的堆栈帧都不会被处理掉,而是在释放了对它的所有引用时。尚未完成的嵌入式/内部函数(如ajax回调)保存对包含堆栈帧的引用,因此它们仍然可用,直到嵌入式函数本身完成,即使包含函数已完成执行。

一旦理解了它,它就非常非常非常有用,并且是C / C ++等其他语言所没有的强大功能。它使局部变量在更多情况下有用。

答案 2 :(得分:3)

这是javascript的基础之一。闭包(lambda函数)从定义它们的作用域继承变量。

它有助于克服基于事件的异步语言带来的许多问题。

function foo() {
    var privateMsg = 'blah...';

    setTimeout(function(){
        alert('private msg: ' + privateMsg);
    }, 5000);
}