javascript函数闭包一直是本人没搞懂,概念模糊的盲点。在项目中也遇到过,只是当真正的代码放我面前的时候我还是搞错。
所以就查阅资料后,对它的基本用途和概念有了一个模糊的印象。要说搞懂了那还差一大截。别信那些 “一句话搞懂js闭包” 的鬼话。言归正传
1.Javascript的变量作用域:全局变量和局部变量。全局变量会带来全局变量”污染“,但是局部变量又导致了函数外部无法读取函数内的局部变量。所以就有了闭包的概念
闭包实例 闭包运行结果2.闭包特性:
2.1:函数嵌套这函数
2.2:函数内部可以引用外部的参数和变量
2.3:参数和变量不会被垃圾回收机制回收
上面这个闭包实例很基础简单的了。仔细看也很好理解。
另外一个闭包实例var result = f1() ---->result = f2
result() -----> f2() 这个时候n是999
nAdd() ------>f1里面的n(999)加上1;
result() ------>f2() 这个时候n是1000了
有人会很疑惑:var n = 999;是在f1里面的局部变量,当被执行一次后,为什么没有被释放内存?这个也是闭包的一个特点:这个变量n的值始终保持在内存中!!!为啥呢?
原因在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存当中,不会再调用结束后被GC(garbage collection)回收.
上面就是我“理解"的函数闭包,希望在实践中得到验证和加强对闭包的理解!
最后贴出参考地址和里面的两道思考题:
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
思考题1:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
console.info(object.getNameFunc()());
思考题2:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
console.info(object.getNameFunc()());
什么?我还像听到你在问我:这题你会吗?我不会呀!求指导!!!!
网友评论