如何将一个元素传递给循环中的jQuerypost

我有以下代码:

for (_field in _fields) { $.post( '/api/fields', { id: _field.id }, function(data, _field) { alert(data); } (data, _fields[_field) ); } 

我必须将_fields[_field]元素传递给从jQuery返回数据的函数,因为在循环期间丢失了对正确对象的引用。 问题是,在定义post函数应该有一个_field参数时,你还必须为数据指定一个参数,否则数据将被_field覆盖。

目前数据返回为undefined因为我没有在循环内定义数据对象。 我也试过传入null ,但这也只是返回null 。 我正在寻找一种方法来传递元素而不会覆盖从post函数返回的数据。

有没有办法解决这个问题,或者是否有一种替代的jQuery方法可以满足需要?

您需要一个函数工厂函数 – 一个创建函数的函数:

 for (_fieldName in _fields) { $.post('/api/fields', { // Unrelated, but I think this bit is wrong; shouldn't it be // `id: _fields[_fieldName].id` ? You're trying to use `.id` on // a string -- see below for a full update id: _fieldName.id }, makeHandler(_fields[_fieldName]) ); } function makeHandler(field) { return function(data) { // Use `data` and `field` here }; } 

请注意,在对象初始值设定项中,我们传入$.post ,我们调用 makeHandler运行并返回我们将传递给$.post的函数。 然后在$.post完成时调用该函数,并且可以访问$.post给出的data参数以及makeHandlerfield参数,因为它是对makeHandler调用的上下文的闭包,其中包括field论证。 更多: 闭包并不复杂


请注意,在上面的代码中,我将变量_field更改为_fieldName更清楚: for..in循环中的变量是一个字符串,即属性的名称 。 另请参阅评论,我认为您试图在错误的地方使用.id 。 这就是我认为你真正想要的东西:

 for (_fieldName in _fields) { _field = _fields[_fieldName]; $.post('/api/fields', { id: _field.id }, makeHandler(_field) ); } function makeHandler(field) { return function(data) { // Use `data` and `field` here }; } 

另请注意,如果_fields是一个数组,则不应在没有安全措施的情况下使用for..in 。 更多: for..in神话和现实