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