繁体   English   中英

需要澄清-将争论传递给函数-Javascript

[英]Clarification required - Passing arguements to functions - Javascript

我对此链接的答案之一有疑问

您是否建议在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM