这是一些JavaScript:
linkElem.click(function () {
var data = linkElem.data();
alert(''+data.mls + ' ' + data.id);
});
有用。
linkElem
是我在函数内部的循环中创建的局部变量。我使用jQuery的.data()
为其分配了一些数据。如果我没有调用.click()
,linkElem
将在循环期间重新分配,然后在函数返回后回收。但是,我创建了一个匿名函数,它引用了linkElem
。所以我不再确定发生了什么。我的猜测是,在循环期间创建的所有匿名函数和
linkElem
都被赋予了某种UID,并已移至持久性/全局范围。它是否正确?免费的细节将不胜感激。 最佳答案
是的,您的描述非常接近。 Javascript函数调用的本地存储只是分配给本地变量的一块内存。如果通过在被调用函数内部创建另一个函数来“捕获”该函数,则将保留存储空间,并且局部变量将继续使用,而不会意识到使它们诞生的函数可能已经死了。
请记住,只有函数才能创建此类存储,这一点很重要-括号括起来的循环体之类的东西并不是单独的存储区域。因此,常见的错误是在一个函数中声明一个变量,然后在循环中创建的多个函数中重新使用它。这并不是天生的错误,但是效果可能令人惊讶:
function whatever() {
for (var i = 0; i < 3; ++i) {
setTimeout(function() { alert(i); }, 5000);
}
}
如果运行该命令,则会看到三个警报都显示为“3”的警报。为什么?因为它们都共享相同的“i”变量。您可以通过引入另一个功能层来避免这种情况:
function whatever() {
for (var i = 0; i < 3; ++i) {
setTimeout((function(private_i) { return function() { alert(private_i); }; })(i), 5000);
}
}
“包装器”功能在那里提供一个局部变量(参数“private_i”),可以将循环变量“i”复制到该变量中。