最近我偶然发现下面的代码,我认为这是一个无效的代码块,但我错了。
[
(function (a) {
console.log(a);
})(5)
]
和这个
{
(function (a) {
console.log(a);
})(5)
}
我想知道为什么上面的代码在javascript中有效以及它与
的区别
(function (a) {
console.log(a);
})(5)
我们称之为什么
答案 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]
相同,并且可能具有此值的数组稍后会有用。
就我个人而言,我不会采用这种阵列初始化方式。那是因为它仍然难以阅读而且目的不明确。