在什么情况下用自执行函数比较好?

发布于 2022-09-04 07:31:55 字数 945 浏览 18 评论 0

自执行函数主要作用在于

  • 避免闭包造成引用变量无法释放

  • 可以隔断作用域,防止变量名污染(这点我不太明白)

对于第一点我的理解是:

例如我创建了一个时间函数,在很多地方要用到。在其它地方引用这个时间函数的时候,实际上在这个时间函数中就会形成闭包,导致这个时间函数内部的局部变量占据的内存无法被释放掉。

var currentTime = (function (){
    var time = new Date();
    var year  = time.getFullYear();
    var month = time.getMonth();
    var date  = time.getDate();
    var hour  = time.getHours();
    var min   = time.getMinutes();
    var sec   = time.getSeconds();

    return year + '-' + month + '-' + date + ' ' + hour + ':' + min + ':' + sec;
})();

如果currentTime这个函数不用自执行的话,那么我在其它地方调用它是不是就会导致currentTime里面的局部变量无法释放掉啊?这是我对第一点的理解。

对于第二点 造成变量名污染

不是太理解,currentTime里面这么多局部变量虽然没有被内存释放掉,但是它们是存在函数内部的啊,我在函数外部和其它地方使用相同的变量名,是不造成污染的吧!

问题:

1、造成局部变量名的污染?
2、什么情况下,或者说在什么样的环境中使用自执行函数比较好?
我记得之前的项目有一个date.js,里面全部是关于时间格式的函数。但是都没有使用自执行,是因为之前的项目用的CMD模块规范,所以不存在这样的问题,是嘛?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

無心 2022-09-11 07:31:55

可能造成局部变量名的污染的情况:
一个页面应用了多个js的时候,变量名就有可能遭受污染。
`//a.js
var name=1;
console.log(name);//1
//b.js
var name=2;
console.log(name);//2
//c.js
console.log(name);//可能是1,可能是2,取决于页面引入a.js和b.js的先后顺序
`
加了自执行,全局变量就会变成局部变量,可以隔断作用域,防止变量名污染

可是我不能没有你 2022-09-11 07:31:55

你在别的地方还可以用相同的名称命名变量

月亮坠入山谷 2022-09-11 07:31:55

你举的例子根本不耽误局部变量回收吧,currentTime只是保存了函数执行结果,函数里面的局部变量在函数执行完就可以被回收了的。

function fun(){
    var n = 0 ;
    return function(){
        return n++;
    }
}
var gen = fun();

这样n是不会被回收的。
命名污染说的是全局作用域下并不存在timehour这些变量,它们只是在函数内有效。

在你怀里撒娇 2022-09-11 07:31:55

首先你要了解闭包的优点就是解决了全局变量的污染,所以不用担心重名的现象,缺点显而易见变量常驻内存会导致内存泄漏的可能,影响性能。自执行函数调用之后会释放内存的所以闭包配自执行函数是可以的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文