gpt4 book ai didi

Javascript:将变量定义为调用相同函数的匿名函数

转载 作者:行者123 更新时间:2023-11-29 15:44:47 24 4
gpt4 key购买 nike

我得到了这样一个函数:

//! 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 中合法吗? (法律意思是它适用于所有符合标准的浏览器)

我的意思是,对我来说,它很像 var c = c + 1;Javascriptint c = c + 1; 中在 C/C++/ObjC/Java 中,在定义变量时引用变量,所以它应该是非法的 或者它是行为应该是未定义的

但是,它似乎在一些浏览器上运行良好。


经过更多的研究和思考,我想出了其他的解决方案。

  • 解决方案 1:命名匿名函数 ( MyFunc ),以便我可以在内部使用它的名称(引用 here )。

代码:

var WorkFunc = function MyFunc() {  // Name it MyFunc.
if(RecordIndex < RecordArray.length)
{
WorkOnRecord(RecordArray[RecordIndex], function() {
MyFunc(); // Use MyFunc here
});
RecordIndex++;
}
};
WorkFunc();
  • 解决方案 2:使用函数声明而不是函数表达式,这样它更像是一个递归函数(虽然不完全是)(引用 here)。

代码:

function WorkFunc() {   // Declare function.
if(RecordIndex < RecordArray.length)
{
WorkOnRecord(RecordArray[RecordIndex], function() {
WorkFunc();
});
RecordIndex++;
}
};
WorkFunc();
  • 解决方案 3:将变量作为参数传递 (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.

但我的问题仍然存在:我最初的解决方案合法吗?

最佳答案

是的。匿名函数可以访问在父作用域中声明的每个变量,无论它们的值如何(这是使用匿名函数进行递归的标准方法)。

请注意,如果稍后在父作用域中将变量设置为 null,匿名函数中的后续调用将抛出 TypeError(因为 null 将不再可调用)。这也意味着您甚至可以更改它的值以针对另一个函数(但这绝对不是一个好的做法)。

关于Javascript:将变量定义为调用相同函数的匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13390575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com