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

这个问题在这里已经有答案了

八年前关闭的

可能重复:
JavaScript中的(function(){})构造是什么

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

(函数(x){
删除x;
返回x;
})(1);

这里发生了一些事情。首先是立即调用函数表达式(IIFE)模式:

(函数(){
//一些代码
})();

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

函数foo(){
//一些代码
}
foo();

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

此语法无效:

函数(){
//一些代码
}();

因为必须将函数包装在括号中,才能将其作为表达式进行解析。详情如下:http://benalman.com/news/2010/11/immediately-invoked-function-expression/

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

(函数(){
//一些代码
})();

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

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

(函数(x){
//一些代码
})(1);

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

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

删除x;
返回x;

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

var foo={'bar':4,'baz':5};
删除foo.bar;
console.log(foo);

记录此事件的结果:

{'baz':5}

鉴于

var foo=4;
删除foo;
console.log(foo);

将记录值4,因为foo是变量而不是属性,因此无法删除

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

bar=4;//请注意缺少“var”。坏习惯!永远不要这样做!
删除条;
console.log(条);//错误-未定义栏。

这次删除有效,因为删除的不是变量,而是全局对象上的属性。实际上,前面的代码片段相当于:

window.bar=4;
删除window.bar;
console.log(window.bar);

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

发表评论