有时我在JS程序中看到这样的结构:
(function() {
// blah blah
})();
任何想法是什么,它的副作用和好处是什么?
答案 0 :(得分:9)
创建新范围(以避免污染父范围)。令人惊讶的是(对于熟悉类C语言的初学者),当您单独使用大括号时,JavaScript不会创建新范围:
{
var a = "foo";
}
// a still == "foo".
(function() {
var b = "bar";
})();
// b doesn't exist.
但是,函数始终会创建一个新范围。由于JavaScript的闭包,来自父作用域的现有变量会自动带入(关闭)到匿名函数中。因此,在其他地方使用匿名函数的情况下(例如问题中)(因为它从未被分配),它基本上就像一个C风格的大括号。
答案 1 :(得分:3)
与许多其他花括号分隔的语言不同,JavaScript不会将变量范围限定到最近的封闭块。相反,var
语句将变量范围扩展到封闭函数。 JavaScript程序员的一个常见错误是在循环或条件内声明var
,并假设它们在块结束时超出范围。
创建一个匿名函数,然后立即执行它(通过在其后面放置()
)会导致创建一个新的范围,确保在wil中声明的变量不会干扰可能存在的其他JavaScript。将整个事物包装在另一组parens中使它成为一个表达式,它可以解决一些语法歧义,以实现最大的浏览器兼容性。
答案 2 :(得分:2)
它可以防止污染全局命名空间。也就是说,标识符不会泄漏到页面/代码/脚本的其余部分。