我得到了这样的函数:
//! Work on record.
/*!
\param[in] Record (object) Record.
\param[in] AsyncCallback (function) Asynchronous callback which is called when the operation is complete. It takes no parameters.
*/
function WorkOnRecord(Record, AsyncCallback)
{
/* Work on Record asynchronously (e.g. by calling $.ajax())
and call AsyncCallback on complete. */
}
现在,我有一个对象数组(RecordArray
),我需要一个接一个地提供给上面的函数,这意味着我必须等到它回调之后再调用它。
所以我想出了:
$(function() {
var RecordArray = SomeOtherFunc(); // RecordArray is an array of objects.
// Work on records, one by one.
var RecordIndex = 0;
var WorkFunc = function() {
// If there are still records to work on...
if(RecordIndex < RecordArray.length)
{
// Work on record.
WorkOnRecord(RecordArray[RecordIndex], function() {
// Move forward to next record.
WorkFunc();
});
RecordIndex++;
}
// If there are no more records to work on...
else
{
/* We are all done. */
}
};
WorkFunc(); // Start working.
});
如您所见,WorkFunc
实际上是在定义变量WorkFunc
本身的匿名函数内调用的。 这在ECMAScript / Javascript 中是否合法? (法律意思是它适用于所有符合标准的浏览器)
我的意思是,对我来说,它与 Javascript 中的var c = c + 1;
或 C / C ++ / ObjC / Java 中的int c = c + 1;
非常相似, 在定义变量时引用变量,因此它应该是非法的或它的行为应该是未定义的。
但是,它似乎在一些浏览器上运行良好。
经过一番研究和思考后,我提出了其他解决方案。
MyFunc
),以便我可以在其中使用其名称(参考here)。代码:
var WorkFunc = function MyFunc() { // Name it MyFunc.
if(RecordIndex < RecordArray.length)
{
WorkOnRecord(RecordArray[RecordIndex], function() {
MyFunc(); // Use MyFunc here
});
RecordIndex++;
}
};
WorkFunc();
代码:
function WorkFunc() { // Declare function.
if(RecordIndex < RecordArray.length)
{
WorkOnRecord(RecordArray[RecordIndex], function() {
WorkFunc();
});
RecordIndex++;
}
};
WorkFunc();
NextStepFunc
)传递,这样我就不需要在里面引用WorkFunc
(这看起来很有趣)。代码:
var WorkFunc = function(NextStepFunc) { // Accept function as parameter.
if(RecordIndex < RecordArray.length)
{
WorkOnRecord(RecordArray[RecordIndex], function() {
NextStepFunc(NextStepFunc); // Call function as defined by parameter.
});
RecordIndex++;
}
};
WorkFunc(WorkFunc); // Pass function as variable to parameter.
但我的问题仍然存在:我的原始解决方案合法?
答案 0 :(得分:1)
是。匿名函数可以访问父作用域中声明的每个变量,无论它们的值如何(这是使用匿名函数进行递归的标准方法)。
请注意,如果稍后在父作用域中将变量设置为null,则匿名函数中的子句调用将抛出TypeError(因为null将不再可调用)。这也意味着你甚至可以改变它的值来定位另一个函数(但这绝对不是一个好习惯)。