javascript 为什么要使用匿名函数 或者说 匿名闭包

(function(){}());... (function () {

}());
展开
 我来答
12917736427c66b6
2015-10-18 · TA获得超过4.1万个赞
知道大有可为答主
回答量:7541
采纳率:83%
帮助的人:627万
展开全部
1、相当划出一块私有作用域,避免数据污染。
2、执行完就销毁,避免内存长驻。
var Calculator = function (eq) {
var eqCtl = document.getElementById(eq);
return {
add: function (x, y) { }
};
};
这个函数 跟 (function () {

}());的区别在于返回的add 引用的函数指向内部的定义的那个function(x,y),而它的作用域包含外部那个 function(eq),由于add是全局的,故垃圾回收知道存在引用,故这些函数就会一直存在不会销毁,直到window的环境不存在即浏览器关闭才能释放内存.而匿名的那个执行一次,而本身又没存在外部引用,垃圾回收就会执行~!这就是2者最大区别。
匿名函数最大的用途是来模拟块级作用域,避免数据污染的。
百度网友a1458a3
2012-04-28 · TA获得超过657个赞
知道小有建树答主
回答量:275
采纳率:0%
帮助的人:249万
展开全部
1,相当划出一块私有作用域,避免数据污染.
2执行完就销毁,避免内存长驻.
var Calculator = function (eq) {
var eqCtl = document.getElementById(eq);
return {
add: function (x, y) { }
};
};
这个函数 跟 (function () {

}());的区别在于返回的add 引用的函数指向内部的定义的那个function(x,y),而它的作用域包含外部那个 function(eq),由于add是全局的,故垃圾回收知道存在引用,故这些函数就会一直存在不会销毁,直到window的环境不存在即浏览器关闭才能释放内存.而匿名的那个执行一次,而本身又没存在外部引用,垃圾回收就会执行~!这就是2者最大区别.
匿名函数最大的用途是来模拟块级作用域,避免数据污染的,
追问
add 为什么是全局的?
追答
抱歉把这里看成返回函数了,这里add只是属性依附所存在对象
,非全局的~!不过在js中只有2个变量类型,全局变量和局部变量.
js规定:所有没用var申明的变量,一律会自动申明为全局变量,所以最好还是明确申明变量.
但有一种情况即使申明了,但还是全局那就是在window中申明,因为那是顶级对象,js中一切都是在window对象下实现的~!
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liujinqing518
2012-04-27 · TA获得超过289个赞
知道小有建树答主
回答量:223
采纳率:0%
帮助的人:113万
展开全部
一般情况下我们定义一个var a=4是window环境下的 就相当于全局变量,如果我们定义在匿名函数中的话就把这个全局环境跟window环境隔开了,避免混淆,而且该匿名函数执行完后就直接销毁了这个匿名函数中定义的变量,释放内存了,但是window的不一样的哇 你关了网页才释放。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
左手编码
2012-04-27 · TA获得超过756个赞
知道小有建树答主
回答量:421
采纳率:0%
帮助的人:352万
展开全部
匿名函数执行一次就被销毁了,所以不会在内存中驻留,防止了内存泄露。其次,函数销毁后,防止了其他人调用。
追问
可是在js 设计模式中 很多时候并不是这样直接自执行 然后销毁的
var Calculator = function (eq) {
var eqCtl = document.getElementById(eq);
return {
add: function (x, y) { }
};
};

比如这样 公开add 私有eqCtl
这样算销毁了吗?
追答
这种跟上面那种还是有区别的。因为可以通过变量Calculator 继续调用函数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式