假设你有[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中使代码在进程中保持活动状态?如果是这样,什么时候才知道何时开始让内存物品死掉?
答案 0 :(得分:5)
答案 1 :(得分:4)
您需要阅读有关javascript闭包的内容。嵌入函数范围内的所有变量(无论是否在父函数中声明)都保持可用,直到对函数内部闭包的所有引用都执行完毕。
由于我最初是一名C / C ++开发人员,我认为它就像堆栈帧的垃圾收集一样。当函数执行完毕时,任何函数的堆栈帧都不会被处理掉,而是在释放了对它的所有引用时。尚未完成的嵌入式/内部函数(如ajax回调)保存对包含堆栈帧的引用,因此它们仍然可用,直到嵌入式函数本身完成,即使包含函数已完成执行。
一旦理解了它,它就非常非常非常有用,并且是C / C ++等其他语言所没有的强大功能。它使局部变量在更多情况下有用。
答案 2 :(得分:3)
这是javascript的基础之一。闭包(lambda函数)从定义它们的作用域继承变量。
它有助于克服基于事件的异步语言带来的许多问题。
function foo() {
var privateMsg = 'blah...';
setTimeout(function(){
alert('private msg: ' + privateMsg);
}, 5000);
}