闭包的描述:闭包就是能够读取其他函数内部的变量的函数。
闭包的用途:1、读取函数内部的变量。2、让变量的值一直保持在内存中。
闭包的注意点:1、闭包会让函数的变量保存在内存中,内存消耗很大。所以不能滥用闭包。(退出前将局部变量全部删除)2、闭包可以改变父函数内部的值
理论要通过实践去理解。
案例1
var name = "The Window";
var object = {
name: "My Object",
/*console.log(this)
* 这时候的this将是object这个对象:{ name: 'My Object', getNameFunc: [Function: getNameFunc] }*/
getNameFunc: function () {
/*这时候console.log(this)
*this将是object这个对象:{ name: 'My Object', getNameFunc: [Function: getNameFunc] }*/
return function () {
/*在匿名函数中console.log(this),匿名函数本身也是个闭包,这时候的this指向window
* 输出是成片的这个:
* { console: [Getter],
DTRACE_NET_SERVER_CONNECTION: [Function],
DTRACE_NET_STREAM_END: [Function],
DTRACE_HTTP_SERVER_REQUEST: [Function],
DTRACE_HTTP_SERVER_RESPONSE: [Function],
DTRACE_HTTP_CLIENT_REQUEST: [Function],
DTRACE_HTTP_CLIENT_RESPONSE: [Function],
global: [Circular],
process:
process {
title: '/usr/local/bin/node',
等等...
*/
console.log(this)
return this.name;
/* 返回this.name,全局this里根本没定义name啊。所以返回undefined*/
};
}
};
console.log(object.getNameFunc()());
如果想让他有输出,就全局定义object
object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
再来个案例
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
/*这时候的this,就是指向object这个对象,将其复制给that,目的为了给下面的匿名函数使用*/
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());