这是一些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”复制到该变量中。

09-15 13:31