如何使用立即调用的函数表达式避免全局作用域污染?
在JavaScript中声明全局作用域变量是一种不好的做法, and is often referred to as global scope pollution. 避免全局作用域污染的解决方案之一是使用立即调用的函数表达式, 或简称生命. IIFE basic code example looks like this:
(function () {
//做有趣的事情
})()
以这种方式声明的函数是一个匿名函数表达式, and is immediately and automatically invoked.
IIFE是如何工作的,匿名函数是如何被立即调用的? 围绕匿名函数的一对括号将其转换为函数表达式, 或者变量表达式. 结果是一个具有自己作用域的未命名函数表达式.
IIFE的使用非常简单. 当你创造生活, 该函数中的每个变量定义都只存在于该作用域中, like a modularization or isolation of the data. IIFE declaration example can look like this:
(函数(){
Var my_data = ";
Var init = function(){
//做点什么
};
init()
})(); //This IIFE will be invoked and executed automatically, without the need to call by yourself
这样,就根本不需要声明全局作用域变量. 在匿名函数中声明的每个变量都可以在自己的作用域中轻松访问, 同时,它保持全局命名空间的整洁. 这很重要,因为它避免了与其他库的任何潜在冲突, 或者用我们自己的代码.
除此之外,IIFE最流行的用法是拥有一个干净的全局作用域, 使用IIFE的另一个好处是,它将代码保存在独立的模块中. How? 与生活任何 var
declared inside isn’t accessible from the outside. 生命只是一个函数, 所以它可以返回任何东西, 和每个函数一样, which enables you to create your own modules like this:
var mySuperModule = (函数(){
var myVar = '一些字符串';
var privateFunction = function (){
/ /做某事
};
return {
getMyVar:函数(){
返回myvar#
}
};
})();
现在是变量 myVar
只存在于 mySuperModule
, which can even have private and public methods.
Many libraries use this technique (like jQuery), 建议至少在应用程序的顶层使用它.
To learn more on the subject, you can read 本·阿尔曼的文章, 掌握模块模式, or Essential JavaScript Namespacing Patterns.