JavaScript_个人笔记8_js的闭包closure
2015-04-12 18:10
302 查看
拥有多个变量,并且同时绑定这些变量环境的表达式,一般为函数,这个就是比较正式的闭包的定义。
表现形式就是一个函数中定义的子函数有引用该函数中的变量,那么这个子函数就是一个闭包。
其实质就是因为有引用关系,同时该闭包未释放(没有被垃圾回收机制回收,那么内存中必须保证被引用对象的值或者状态)。
而为了理解闭包的一个关键其实是理解清楚js对象的作用域链:
1)js里面一切皆对象,在对象里面都有一个关键字this引用本身,函数也不例外。
这个js片段比较有意思:
1 obj对象包含两个属性,name, getNameFunc,两者用逗号隔开,而非用分号,这一点很重要!
2 getNameFunc的实现是返回一个函数 retFunc
3 这个问题的关键是this,由于retFunc是一个匿名函数,同时它是一个对象,那么this就是指带这个对象,很显然,这个对象里面并没有定义name,也就是在本地找不到,转向全局,正好外部有一个name,且初始值是Outer name,那么结果就是它了。
表现形式就是一个函数中定义的子函数有引用该函数中的变量,那么这个子函数就是一个闭包。
其实质就是因为有引用关系,同时该闭包未释放(没有被垃圾回收机制回收,那么内存中必须保证被引用对象的值或者状态)。
而为了理解闭包的一个关键其实是理解清楚js对象的作用域链:
1)js里面一切皆对象,在对象里面都有一个关键字this引用本身,函数也不例外。
var name = "Outer name."; var obj = { name: "inner thing.", getNameFunc: function(){ return function(){ return this.name; } } } alert(obj.getNameFunc()());
这个js片段比较有意思:
1 obj对象包含两个属性,name, getNameFunc,两者用逗号隔开,而非用分号,这一点很重要!
2 getNameFunc的实现是返回一个函数 retFunc
3 这个问题的关键是this,由于retFunc是一个匿名函数,同时它是一个对象,那么this就是指带这个对象,很显然,这个对象里面并没有定义name,也就是在本地找不到,转向全局,正好外部有一个name,且初始值是Outer name,那么结果就是它了。
相关文章推荐
- JavaScript_个人笔记9_悟透js闭包
- JS学习笔记:JavaScript匿名函数与闭包(closure)
- javascript学习笔记(十三) js闭包介绍(转)
- 个人对JS闭包(Closure)的理解
- JavaScript个人笔记:js模块化开发seajs实战拖拽
- JavaScript学习总结二:js闭包(Closure)概念
- JavaScript学习笔记(九)—— JS 理解闭包
- [JS]学习Javascript闭包(Closure)
- 学习Javascript闭包(Closure) 个人觉得非常浅显易懂
- JavaScript个人笔记:js模块化开发seajs+gruntjs
- JavaScript个人笔记:js模块化开发seajs基础
- JavaScript_个人笔记10_由一个JS语法错误想到的
- javascript学习笔记(十三) js闭包(转)
- JavaScript学习总结二:js闭包(Closure)概念
- JavaScript 学习笔记(十六) js事件
- 关于JAVASCRIPT中的闭包(Closure)!
- JavaScript 学习笔记(十六) js事件
- Javascript--闭包(closure)
- Javascript--闭包(closure)
- 再谈javascript闭包--Javascript高级用法 ----在Javascript中,什么是闭包(Closure)