2017-06-18 48 views
-1

最近我在教程中看到了这些函数。它们是否相同?这些功能是否等同?

(_ => console.log(1))(); 

(() => console.log(1))(); 
+1

它们是等价的。两个打印“1”到控制台。 – Pointy

+0

但是为什么使用_和()作为匿名函数,是一样的?为什么使用_? – James

+1

为简洁起见,有时会这样写。它通常意味着“被忽略”。 – Ben

回答

1

这两个功能完全一样。唯一的区别是顶层功能需要一个参数,_,而另一个参数为零。这个例子中没有关系,因为你不使用_变量。

但是,如果您使用_作为变量名,并且您在该函数中使用它,则会遇到问题。例如:

(_ => console.log(_))(); 

不是一回事

(() => console.log(_))(); 

在第一行中,函数打印参数_,其中,在这种情况下是undefined的值,因为没有值被传递到它。在第二行中,函数打印全局变量_的值。如果您使用像underscore.js这样的库,其中使用变量_,这可能会成为问题。

+1

尽管两者在内部产生相同的输出,但它们是不同的,对吗? – James

1

A“脂肪箭头”(=>)函数可以用单个标识符参数名被声明,或与零个或更多个参数的括号的列表。您的第一个示例

(_ => console.log(1))(); 

是第一种情况,参数名称为“_”。第二个例子是一个参数列表不带参数:

(() => console.log(1))(); 

既不功能使用其参数的,并且两个调用传递任何参数。也就是说,这两个函数调用都没有实际的参数;报表均以()结尾。这两者是否“等同”取决于你对“等效”的定义。在这两种情况下,都会发生完全相同的事情。但是,匿名胖箭头功能并不完全相同。

+1

在Erlang编程语言中,显式被视为“忽略”的参数以下划线开头。有趣的事实。 – Pointy

+0

很高兴知道,感谢您的提示! – James

0

不,它们不相同。第一个是具有1个参数的匿名胖箭头函数,第二个是具有0个参数的匿名胖箭头函数。因此,第一个依赖于将一个函数的参数传递太少并不是ECMAScript中的错误。

下划线_有时用于指示满足某个合同所需的参数,但实际上被忽略。但是,在这种情况下,由于参数不是必需,因此这是该惯例的滥用:该函数不带参数被调用,因此不需要声明参数。