八年前关闭的
可能重复:
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变量示例的