我在很多脚本中看到这种模式
(function(){})();
它是什么以及为什么使用它?
它用于强制创建本地范围,避免声明污染当前(通常是全局)范围。
如果你想避免匿名函数,可以这样重写:
var scope = function() { /*...*/ };
scope();
但是匿名函数语法的优点是父作用域或全局作用域甚至不会被函数名称污染。
(function() { /*...*/ })();
这也是在 JavaScript 中实现信息隐藏的好方法,因为此范围内的声明(函数和变量)从外部不可见。但他们仍然可以看到对方,并且当 JavaScript 实现闭包时,在这样的作用域内声明的函数将可以访问同一作用域内的其他声明。
那就是定义一个没有名字的函数,并立即调用它。因为 Javascript 函数充当闭包(持久作用域),所以这是创建一组互连对象或函数的有用方法。
匿名函数是在不绑定到标识符的情况下定义并可能调用的函数(或子例程)。
这是创建闭包的基本语法。更典型的是,它会包含一些代码:
(function(){
//Your Code Here
})();
这相当于
var some_function = function() {
//Your Code Here
};
some_function();
这样做的最大原因是清洁;在任何函数外部声明的任何变量都是全局的;但是,在此函数内部声明的变量包含在该函数内部,不会影响该函数外部的任何代码或与该函数外部的任何代码交互。将任何类型的可重用插件包装在闭包中是一个很好的做法。
它立即执行匿名函数。 基本上是一样的:
var test = function(){};
test();
但不需要使用附加变量。 您需要将其括在额外的括号中以获取表达式结果的函数 - 否则它会被理解为函数声明,并且您无法执行声明。
它主要用于作用域保护 - 因为 JS 具有函数作用域,因此在此类函数内定义为
var x;
的每个变量都将保留在其函数局部作用域中。
所有这些只是意味着“立即执行该函数内的所有内容,而不污染全局范围”。
它也常用于众所周知的模式,例如模块模式和显示模块模式。请参阅 http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth 了解更多详细信息。
它被称为立即函数或匿名闭包,是模块模式的基础。
它用于为代码创建私有本地范围。