可能重复:
What is the (function() { } )() construct in JavaScript?
我遇到了一些JavaScript代码,但我不知道该怎么做。为什么运行此代码时会得到“1”?这个奇怪的小附录是什么(1),为什么函数用括号括起来?
(function(x){
delete x;
return x;
})(1);
答案 0 :(得分:227)
这里有一些事情发生。首先是immediately invoked function expression(IIFE)模式:
(function() {
// Some code
})();
这提供了一种在自己的范围内执行某些JavaScript代码的方法。通常使用它,以便在函数内创建的任何变量都不会影响全局范围。你可以改用它:
function foo() {
// Some code
}
foo();
但是这需要给函数命名,这并不总是必要的。使用命名函数也意味着在将来的某个时刻可以再次调用该函数,这可能是不可取的。通过以这种方式使用匿名函数,您可以确保它只执行一次。
此语法无效:
function() {
// Some code
}();
因为你必须将函数包装在括号中,以使其作为表达式进行解析。更多信息请访问:http://benalman.com/news/2010/11/immediately-invoked-function-expression/
所以要快速回顾一下IIFE模式:
(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的工作方式。如果分配给变量而不先声明它,它实际上不会变成变量,而是全局对象上的属性:
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变量示例。
答案 1 :(得分:9)
这意味着您创建了一个匿名函数,并使用参数1
调用它。
它与:
相同function foo(x) {
delete x;
return x;
}
foo(1);
答案 2 :(得分:2)
人们通常将这些称为“立即调用的函数表达式”或“自我执行函数”。
这样做的意思是在该函数内声明的变量不会泄漏到外部。
答案 3 :(得分:1)
您仍然返回1的原因是 delete关键字用于删除对象的属性。其余的就像其他人评论的那样,括号中包含的任何内容都作为函数执行,第二组括号是传递给该块的参数。
这是MDN reference for delete和MDN reference for closures,它还讨论了匿名函数。