为什么这是有效的代码,我们称之为什么

时间:2017-04-13 12:41:33

标签: javascript

最近我偶然发现下面的代码,我认为这是一个无效的代码块,但我错了。

[
 (function (a) {
   console.log(a);
 })(5)
]  

和这个

{
  (function (a) {
  	console.log(a);
  })(5)
}

我想知道为什么上面的代码在javascript中有效以及它与

的区别

(function (a) {
  console.log(a);
})(5) 

我们称之为什么

2 个答案:

答案 0 :(得分:0)

[
 (function (a) {
   console.log(a);
 })(5),
(function (a) {
   console.log(a);
 })(6),
]  

这是一个有效的代码。它是一组自执行函数。 (AKA即时功能) 在此代码中,两个函数都将运行。

带花括号的另一个只是一个由代码块修饰的函数调用。没有什么特别的或无效的,与上一个完全相同。

答案 1 :(得分:0)

好的,让我试着根据评论来回答这个问题。

  

为什么上面的代码有效

这类问题总是只有一个答案:因为这就是JavaScript的工作原理。但让我深入了解细节。

此代码:

[
 (function (a) {
   console.log(a);
 })(5)
];

和这个

{
 (function (a) {
   console.log(a);
 })(5)
}

在功能上等同于此

 (function (a) {
   console.log(a);
 })(5);

第一个创建一个只包含一个元素的临时数组:无论函数返回什么(在这种情况下它不返回任何内容,即未定义)。然后数组被销毁(因为没有任何引用它),这引出了一个问题:为什么我们首先创建它?

第二个只是一段代码。这是{}在没有被用作对象时所做的事情,例如

{
    var x = 1;
    console.log(x);
}

总而言之:使用额外的括号[]{}只是浪费角色,更糟糕的是,它会让读者感到困惑。因为意图不明确。

但是这段代码:

var a = [
 (function (a) {
   console.log(a);
 })(5)
];

是另一回事。现在你有一个数组初始化只有一个元素,这是内部函数返回的内容(在本例中是undefined)。您可以在以后随意使用,例如console.log(a.length);。更有用的是从函数中返回一些东西:

var a = [
 (function (a) {
   return a > 0;
 })(5)
];

现在a[true]相同,并且可能具有此值的数组稍后会有用。

就我个人而言,我不会采用这种阵列初始化方式。那是因为它仍然难以阅读而且目的不明确。