我经常使用此功能:在$.each(Ojbect, function)
中,函数应该有两个参数:
function (index, value) {...}
(根据jQuery API文档:enter link description here)。大多数时候,我定义了一个非arg函数。例如,仅打印出值。
$.each([1,2,3], function(){
console.log($(this);
});
所以$ .each正在接受我的no-arg func。这在日常使用中非常方便。但我没有找到任何正式文件说这没关系。只是要记住,为什么这样的方式有效?
答案 0 :(得分:2)
这就是JavaScript函数调用的工作方式。传递给函数的参数数量不需要与该函数定义中的参数数量相匹配。如果参数少于参数(如在您的示例中),则在函数内仍可通过参数array-like对象访问参数。如果参数多于参数,则没有匹配参数的变量将为undefined
:
[
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' ) );
答案 1 :(得分:2)
Javascript是动态语言,功能是一等公民。此外,函数参数几乎被命名为arguments
类数组对象的定位元素的别名。
鉴于您可以使用0参数定义函数,并且仍然可以看到传递给它的参数值:
(function() { console.log(arguments) } )('a',1,null, 'hey')
>outputs: ["a", 1, null, "hey"]
由于js是动态语言,因此VM无法强制执行函数参数类型或其编号。例如,没有办法指定类型。
在Typescript中有更好的支持,允许你强制传递给函数的参数类型和数量,但你观察到的是javascript的工作原理。
答案 2 :(得分:0)
回调参数是可选的,无论你是否设置它们完全取决于你的需要。如果你必须在回调范围内访问它们,它们应该在那里。在你的console.log示例中,可以退出args。这导致代码更短且更容易阅读(因为其中没有未使用的变量)
答案 3 :(得分:0)
在Javascript中,只有在函数中使用参数时才需要定义参数。如果不使用它们,那么最佳实践建议不要定义它们(事实上,如果定义了参数但未使用javascript代码分析工具,如jshint和jslint将报告错误。)
所以,在回答你的问题时,你可以完全定义你的功能。