如果我传入一个无参数函数作为回调期望参数,为什么它可以工作?

时间:2016-07-04 22:21:02

标签: javascript jquery

我经常使用此功能:在$.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。这在日常使用中非常方便。但我没有找到任何正式文件说这没关系。只是要记住,为什么这样的方式有效?

4 个答案:

答案 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将报告错误。)

所以,在回答你的问题时,你可以完全定义你的功能。