[英]Clarification required - Passing arguements to functions - Javascript
我对此链接的答案之一有疑问
我正在提供我需要澄清的特定答案:
一个不明确的情况,在没有分号的情况下会中断:
// define a function var fn = function () { //... } // semicolon missing at this line // then execute some code inside a closure (function () { //... })();
这将解释为:
var fn = function () { //... }(function () { //... })();
我们最终将第二个函数作为参数传递给第一个函数,然后尝试将第一个函数调用的结果作为函数调用。 第二个函数将在运行时失败,并显示“ ...不是函数”错误。
我的疑问是第二个功能为何成为第一个功能的参数? 因为就我所知
function myFunc(/*argument goes here*/){}
而不是在{}
。
有人可以明确说明函数和它们各自的参数是什么吗?
我认为您正在混淆函数定义中的参数和调用函数时传递的参数。 这些参数都走在第一个括号,当你定义的功能,但参数在第二个去的时候你怎么称呼它。
例如:
let test = function(arg){ // define parameters here console.log("called with", arg) // use arguments here } ("hello") //pass in arguments here
混淆可能是由于对两个相关但略有不同的事物使用术语“参数”引起的:
由于这些事物是相关的,因此人们有时会使用相同的单词(有时称为参数,有时称为参数)来引用这两个不同的概念。 此处更好地解释了差异:参数和参数之间有什么区别?
答案的OP意味着,当您缩小JavaScript文件时,如果IIFE跟随函数而在它们之间没有分号,则它将中断。
现在回答您的问题:
第二个函数为何成为第一个函数的参数?
您如何调用函数? 您在其后添加括号()
。
在上述情况下,代码如下所示:
var fn = function () { ... }(function () { ... })();
// i.e.
var fn = function() { ... }(...)();
因此,它将调用该函数,并期望另一个函数输出它。
您可以将()
放在其后直接调用任何函数。 就像您调用方法一样。 myMethod( arguments )
。
因此,如果您编写一个函数定义,然后将()
添加到末尾,则会立即调用它:
var fn = function() { console.log( 'function executing' ); }();
调用函数时, ()
之间的任何内容都将解释为该函数的参数。 并且由于函数可以作为其他函数的参数,因此省略其中一个;
,使第二个函数成为第一个函数的参数。
此类直接调用的函数称为IIFE: Immediately Invoked Function Expression
。
因此,以下两行结果相同:
var first = function( arg ) { console.log( "arg: " + arg ); }( "first argument" ); var second = function( arg ) { console.log( "arg: " + arg ); }; second( "first argument" );
两者之间的区别在于,首先在定义后添加()
立即调用该函数。 第二个函数在下一行分别调用。
为了使IIFE函数之间有更大的区别,通常将它们包装在一组额外的()
,以更清楚地表明它是IIFE:
(function(){ ... })( arg );
甚至更清晰(function(){ ... }( arg ));
。
众所周知,编写这样的IIFE
是行不通的,因为要将函数作为表达式求值,需要额外的括号
function foo() {
}();
取而代之的是
(function foo() {
})();
嗯,如果已经通过将其分配给这样的变量来使其成为表达式,则情况并非如此
let foo = function foo() {
}();
现在,只要编写类似于上一个示例的函数,就可以省略;
那么您就可以陷入运行第一个函数的陷阱,而将第二个函数传递给您的示例所示。
let foo = function foo() {
//...
}(function () {
//...
})();
首先,第1行的函数是函数表达式,而不是函数声明 。 将立即调用后跟一对括号的函数表达式(也称为IIFE)。 因此,以下代码将记录Hello World :
var fn = function(a){ console.log(a) }("Hello World");
在您的代码中,第二个函数将传递给第一个函数,但它的引用未存储在任何形式参数中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.