你想要一个函数工厂函数——一个创建函数的函数:
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