Javascript 如果我传入一个无参数函数作为回调参数,它为什么会起作用?

Javascript 如果我传入一个无参数函数作为回调参数,它为什么会起作用?,javascript,jquery,Javascript,Jquery,我经常使用此功能:在$中。每个(Ojbect,function),函数应该包含两个参数: function (index, value) {...} (根据jQueryAPI文档:)。大多数时候,我将我的函数定义为非arg函数。例如,仅打印值 $.each([1,2,3], function(){ console.log($(this); }); 所以$。每个都接受我的no arg func。这在日常使用中非常方便。但我没有发现任何官方文件说这是可以的。请记住,为什么这样做有效?回调参

我经常使用此功能:在
$中。每个(Ojbect,function)
,函数应该包含两个参数:

function (index, value) {...}
(根据jQueryAPI文档:)。大多数时候,我将我的函数定义为非arg函数。例如,仅打印值

$.each([1,2,3], function(){
   console.log($(this);
});

所以$。每个都接受我的no arg func。这在日常使用中非常方便。但我没有发现任何官方文件说这是可以的。请记住,为什么这样做有效?

回调参数是可选的,您是否设置它们完全取决于您的需要。如果必须在回调范围内访问它们,它们应该在那里。在您的console.log示例中,可以省略args。这导致代码更短,更易于阅读(因为代码中没有未使用的变量)

在Javascript中,只有在函数中使用参数时才需要定义参数。如果没有使用它们,那么最佳实践建议不要定义它们(事实上,如果定义了参数但没有使用,则jshint和jslint等Javascript代码分析工具将报告错误)


因此,在回答您的问题时,可以按照现有的方式定义函数。

这就是JavaScript函数调用的工作方式。传递给函数的参数数量不需要与该函数定义中的参数数量匹配。如果参数少于参数(如示例中所示),则仍可以通过arguments数组(如对象)在函数中访问参数。如果参数多于参数,则没有匹配参数的变量将
未定义

[
 function(){ console.log( arguments ); },     // ['foo', 'bar']
 function(x){ console.log( x, arguments ); }, // 'foo' ['foo', 'bar']
 function(x,y){ console.log( x, y ); },       // 'foo' 'bar'
 function(x,y,z){ console.log( x, y, z ); },  // 'foo' 'bar' undefined
].

// Call each function with two arguments: 'foo' and 'bar'
forEach( func => func( 'foo', 'bar' ) );

Javascript是一种动态语言,函数是一等公民。另外,函数参数是类似数组对象的
参数的定位元素的别名

假设您可以使用0个参数定义函数,但仍然可以看到传递给它的参数值:

 (function() { console.log(arguments) } )('a',1,null, 'hey')

 >outputs: ["a", 1, null, "hey"]
由于js是动态语言,VM无法强制执行函数参数类型或数量。例如,也没有办法指定类型


在Typescript中,对这类内容有更好的支持,它允许您强制执行传递给函数的参数的类型和数量,但您观察的是javascript是如何工作的。

请注意,是jQuery安排
引用数组中的每个元素。如果在阵列原型上使用本机的
.forEach()
,它不会这样做,因此回调将无法工作。