4

我有以下代码:

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 方法可以满足需要?

4

1 回答 1

7

你想要一个函数工厂函数——一个创建函数的函数:

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,并且可以访问提供它的data参数$.post以及 的field参数makeHandler,因为它是调用上下文的闭包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

于 2012-04-16T08:52:49.640 回答