今天来简单聊一聊之前写毕设用的非常多的IIFE。
首先来看一段javascript
(function(){
})()
这其实就是IIFE(立即执行的函数表达式)
。
这个大家应该都遇见过,不过不知道大家第一次看到这个时会不会想这样写有什么用途?一般是用在什么地方?
IIFE有什么用途
1.总是将代码包裹成一个 IIFE(Immediately-Invoked Function Expression),用以创建独立隔绝的定义域。这一举措可防止全局命名空间被污染。所谓不去污染全局命名空间,是因为 IIFE 创建了一个新的函数作用域,你真正的业务代码被封装在其中,自然就不会触碰到全局对象了。如果你需要全局对象,那就 pass 给 IIFE:
(function (global) {
// 在这里,global 就是全局对象了
})(this) // 在浏览器里,this 就是 window 对象
2.IIFE 还可确保你的代码不会轻易被其它全局命名空间里的代码所修改(i.e. 第三方库,window 引用,被覆盖的未定义的关键字等等)。
IIFE一般用在什么地方
1.无论何时,想要创建一个新的封闭的定义域,那就用 IIFE。它不仅避免了干扰,也使得内存在执行完后立即释放。
2.所有脚本文件建议都从 IIFE 开始。
一般怎么写IIFE
推荐
(function(){
'use strict';
// Code goes here
}());
(function($, w, d){
'use strict';
$(function() {
w.alert(d.querySelectorAll('div').length);
});
}(jQuery, window, document));
ES6中使用let取代IIFE
ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。如果我们只是在某个代码块中使用某个变量,我们可以使用let,再也不需要使用IIFE了:
{
let private = 1;
}
console.log(private); // 未捕获 ReferenceError