高级JavaScript:为什么这个函数用括号括起来?

高级JavaScript:为什么这个函数用括号括起来?,javascript,function,syntax,parentheses,iife,Javascript,Function,Syntax,Parentheses,Iife,可能重复: 我遇到了这段JavaScript代码,但我不知道如何利用它。为什么运行此代码时会得到“1”?(1)的这个奇怪的小附录是什么?为什么函数用括号括起来 (function(x){ delete x; return x; })(1); 这意味着您创建了一个匿名函数,并使用参数1调用它 这与: function foo(x) { delete x; return x; } foo(1); 仍然返回1的原因是delete关键字用于删除对象的属性。其余的正如

可能重复:

我遇到了这段JavaScript代码,但我不知道如何利用它。为什么运行此代码时会得到“1”?(1)的这个奇怪的小附录是什么?为什么函数用括号括起来

(function(x){
    delete x;
    return x;
})(1);

这意味着您创建了一个匿名函数,并使用参数
1
调用它

这与:

function foo(x) {
    delete x;
    return x;
}
foo(1);

仍然返回1的原因是delete关键字用于删除对象的属性。其余的正如其他人所评论的,任何用括号括起来的东西都作为函数执行,第二组括号是传递给该块的参数


下面是,和,其中还讨论了匿名函数

人们通常称这些为“立即调用的函数表达式”或“自动执行函数”


这样做的意义在于,函数内部声明的变量不会泄漏到外部。

这里有一些事情。首先是(IIFE)模式:

这提供了一种在自己的范围内执行某些JavaScript代码的方法。它通常用于使函数中创建的任何变量都不会影响全局范围。您可以使用此选项:

function foo() {
  // Some code
}
foo();
但这需要为函数指定一个名称,这并不总是必需的。使用命名函数还意味着在将来某个时候,可能会再次调用该函数,这可能是不可取的。通过以这种方式使用匿名函数,可以确保它只执行一次

此语法无效:

function() {
  // Some code
}();
因为必须将函数包装在括号中,才能将其作为表达式进行解析。详情如下:

因此,要快速回顾IIFE模式:

(function() {
  // Some code
})();
(function() {
  // Some code
})();
允许立即执行“某些代码”,就像它只是内联编写的一样,但也可以在其自身范围内执行,以避免影响全局命名空间(从而可能干扰或被其他脚本干扰)

您可以像传递普通函数一样向函数传递参数,例如

(function(x) {
  // Some code
})(1);
因此,我们将值“1”作为第一个参数传递给函数,函数将其作为一个局部作用域变量(名为x)接收

其次,您拥有函数代码本身的勇气:

delete x;
return x;
“删除”操作符将从对象中删除属性。它不会删除变量。所以,

var foo = {'bar':4, 'baz':5};
delete foo.bar;
console.log(foo);
记录此事件的结果:

{'baz':5}
鉴于

var foo = 4;
delete foo;
console.log(foo);
将记录值4,因为foo是变量而不是属性,因此无法删除

由于autoglobals的工作方式,许多人认为delete可以删除变量。如果未先声明就分配给变量,则该变量实际上不会成为变量,而是全局对象上的属性:

bar = 4; // Note the lack of 'var'. Bad practice! Don't ever do this!
delete bar;
console.log(bar); // Error - bar is not defined.
这次删除有效,因为删除的不是变量,而是全局对象上的属性。实际上,前面的代码片段相当于:

window.bar = 4;
delete window.bar;
console.log(window.bar);

现在您可以看到它是如何类似于foo对象示例而不是foo变量示例的。

我将使用
var foo=function(){}
避免混淆函数语句和函数表达式。@missingno它们是相同的。解释得很好。另外,作为旁注,我看到道格拉斯·克罗克福德在一次演讲中提到他更喜欢(function(){}());为了清晰起见,有效地将整个生命包装在parens中-更具表现力。与wiki链接相比,parens包装了整个生命,这有什么区别吗?因此在
(函数(x){delete x;return x;})(1)
删除x
没有任何效果,对吗?因为
x
是一个变量,而不是一个属性。因此,
delete x
没有任何效果,对吗?@Utku是的,没错