标签:
阅读文章前, 请先阅读阮一峰老师的这篇文章http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
前人写过的, 而且写得很好, 就没必要重复下去了. 只加一些阮老师的文章里没有说的.顺便总结一下.
引用一句话: "闭包就是functions that return function"(出处已经忘记啦)
闭包的类型: 循环闭包, 函数闭包
闭包的特点: 外部访问函数内部的值, 函数内部变量不被回收
函数闭包类型中闭包函数的this指向.
考虑如下代码:
var name = "window"; var object = { name : "object", getNameFunc : function(){ return function(){ return this.name; }; } }; var obj = { name : "object", getNameFunc : object.getNameFunc() }; function foo() { return this.name; } console.log(foo());//Window console.log(object.getNameFunc()()); //Window console.log(obj.getNameFunc()); //object
闭包函数无法直接访问包含他的函数的this对象, 因为二者的this指向是不一样的.
外部函数的this指向调用他的对象, 内部函数的this指向了全局对象, 其实并不难理解.
类比以下两个函数的调用
foo();//Window
object.getNameFunc()(); //Window
实际上, 当调用object.getNameFunc()时, 就像全局对象返回了一个函数, 返回的这个函数和foo函数其实并无两样.
在全局中调用这个返回的函数时, 函数的this自然就指向了全局对象, 就好像调用foo函数一样.
而当object.getNameFunc()在obj内部时, 返回的闭包函数就成了obj 的属性, 此时闭包函数的this就指向了obj对象.
标签:
原文地址:http://www.cnblogs.com/donotcheap/p/5778035.html