Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS中命名回调函数和匿名回调函数的区别_Javascript_Function_Callback - Fatal编程技术网

Javascript JS中命名回调函数和匿名回调函数的区别

Javascript JS中命名回调函数和匿名回调函数的区别,javascript,function,callback,Javascript,Function,Callback,我编写了以下实践代码来比较命名回调函数和匿名回调函数之间的差异,但是命名回调函数会抛出错误,我想知道为什么以及使用命名回调函数的正确方法是什么。谢谢你的关注 friends = ["John", "Mike", "Resch", "Tony"]; friends.forEach(function(value, index) { console.log('index of ' + index + ', value is: ' + value); }); function iterate(v

我编写了以下实践代码来比较命名回调函数和匿名回调函数之间的差异,但是命名回调函数会抛出错误,我想知道为什么以及使用命名回调函数的正确方法是什么。谢谢你的关注

friends = ["John", "Mike", "Resch", "Tony"];

friends.forEach(function(value, index) {
  console.log('index of ' + index + ', value is: ' + value);
});

function iterate(value, index)
{
  console.log('index of ' + index + ', value is: ' + value);
}

friends.forEach(iterate(value, index));

最后一行应该是:

friends.forEach(iterate);
这将传递
函数
迭代
,以便
.forEach()
可以调用它并为其参数、
索引
提供参数

通过在其后面包含附加括号,
iterate
实际上会立即被调用,并(尝试)传递其返回值(
undefined

这些错误可能是因为
value
index
iterate()
之外不存在


为便于比较,等效于:

friends.forEach(iterate(value, index));
使用匿名函数将是:

friends.forEach(function(value, index) {
  console.log('index of ' + index + ', value is: ' + value);
}(value, index));
JS中命名回调函数和匿名回调函数的区别是什么

很少(不包括其他答案中指出的代码错误)

鉴于:

var data = [ ... ];

function foo(value, key, object){ /* do stuff */ }
那么从迭代器的角度来看,以下两者之间没有区别:

data.forEach(foo);

在这两种情况下,forEach都被传递一个对函数对象的引用。它不知道函数的名称,也不关心,它只是调用它并传递所需的值

因此,从forEach的角度来看,无论函数是用带名称还是不带名称的函数表达式声明还是初始化,结果都是相同的

回调内部存在差异。由于在第二种情况下,函数表达式中没有提供名称,因此它只能使用arguments.callee引用自身(比如递归),这是一些人不喜欢的,并且在严格模式下不可用

修复方法是使用声明的函数(如上面的第一个示例所示),或使用名称为的函数表达式:

data.forEach(function foo (value, key, object){ /* foo references function */ });
后者意味着(在兼容ECMA-262的浏览器中)名称仅在函数内部可用。但是,IE版本8和更低版本将命名函数表达式命名为全局对象的属性(更多或更少的全局变量),因此通常避免使用它们:

(function foo(){}());

alert(typeof foo);  // function in IE 8 and lower
                    // undefined in compliant browsers

当然,在迭代器中使用递归函数是很少见的(但可能并非闻所未闻)。

它只是
朋友。forEach(iterate)
但是定义的函数“iterate”定义了两个参数,对吗?对,您已经用
函数iterate(value,index)
定义了它们<代码>数组。forEach需要对函数的引用。它将迭代其内容,并使用两(三)个参数调用该函数。您将函数定义为需要两个参数,无论是否命名。在第一个示例中,您定义了一个匿名函数,并立即将其传递给
forEach
。在第二个示例中,您定义了
iterate
,但立即调用它(使用未定义的变量),并将结果(未定义)传递给
forEach
$。每个(朋友,iterate(value,index))@银弹:不管你想说什么,都是错的。不要混淆运算。对于运算:
forEach
作为第一个参数传递,将
索引
作为第二个参数传递,将要执行的数组作为第三个参数传递给任何函数。
(function foo(){}());

alert(typeof foo);  // function in IE 8 and lower
                    // undefined in compliant browsers