ITPub博客

首页 > 应用开发 > IT综合 > 怎么理解javascript闭包

怎么理解javascript闭包

原创 IT综合 作者:玫瑰情书 时间:2014-05-06 17:24:33 0 删除 编辑
怎么理解javascript闭包?


怎么理解javascript闭包?比较难懂啊,求大神们解惑!

北风网解答:

闭包是什么?闭包是Closure,这是静态语言所不具有的一个新特性。但是闭包也不是什么复杂到不可理解的东西,简而言之,闭包就是: 
 
闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。 
闭包就是就是函数的“堆栈”在函数返回后并不释放,我们也可以理解为这些函数堆栈并不在栈上分配而是在堆上分配 
当在一个函数内定义另外一个函数就会产生闭包 
上面的第二定义是第一个补充说明,抽取第一个定义的主谓宾——闭包是函数的‘局部变量’集合。只是这个局部变量是可以在函数返回后被访问。(这个不是官方定义,但是这个定义应该更有利于你理解闭包) 
 
做为局部变量都可以被函数内的代码访问,这个和静态语言是没有差别。闭包的差别在于局部变变量可以在函数执行结束后仍然被函数外的代码访问。这意味着函数必须返回一个指向闭包的“引用”,或将这个”引用”赋值给某个外部变量,才能保证闭包中局部变量被外部代码访问。当然包含这个引用的实体应该是一个对象,因为在Javascript中除了基本类型剩下的就都是对象了。可惜的是,ECMAScript并没有提供相关的成员和方法来访问闭包中的局部变量。但是在ECMAScript中,函数对象中定义的内部函数(inner function)是可以直接访问外部函数的局部变量,通过这种机制,我们就可以以如下的方式完成对闭包的访问了。 
 
function greeting(name) { 
    var text = 'Hello ' + name; // local variable 
    // 每次调用时,产生闭包,并返回内部函数对象给调用者 
    return function() { alert(text); } 
} 
var sayHello=greeting("Closure"); 
sayHello()  // 通过闭包访问到了局部变量text 
上述代码的执行结果是:Hello Closure,因为sayHello()函数在greeting函数执行完毕后,仍然可以访问到了定义在其之内的局部变量text。 
 
好了,这个就是传说中闭包的效果,闭包在Javascript中有多种应用场景和模式,比如Singleton,Power Ctructor等这些Javascript模式都离不开对闭包的使用。


详细查看:http://bbs.ibeifeng.com/read-htm-tid-65272.html
更多WEB前端开发方案解决:http://bbs.ibeifeng.com/thread-htm-fid-150.html

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29511780/viewspace-1155312/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-02-28

  • 博文量
    19
  • 访问量
    176814