关于JavaScript闭包的那点事
闭包的定义为:有权访问另一个函数作用域中变量的函数….
闭包的主要实现手段为返回函数.
要知道的是JavaScript中函数的调用,当一个函数被调用时,系统会开辟出一块内存,并且向这段内存区域中依次压入(只是为了方边理解用栈操作描述)全局作业域变量,全局内一级变量,全局内二级变量…..直到压入当前函数所拥有的变量,当一个函数执行完毕后就会清空这块内存空间.
假设全局变量有 a b ;全局下有个函数func1,func1有函数c d;系统调用函数func1时就会建立一个栈压入 a b 再压入 c d(注意其实压入的是 a b数值的复制,并不是本体),如果func1下还有func2有变量 e f 则同理调用func2时建立栈 压入 a b 再压 c d 在压 e f ,当func1执行结束后就会销毁 有abcd的栈,而func2的栈不受影响,这时返回func2,其实就是把c d 保护起来并且传出来了,这就构成的闭包.
(function() {
var catname = “tom”;
function cat() {
console.log("aaa");
console.log(catname);
return 22;
}
ob = function() {
}
ob.prototype.bb = function() {
//catname = "tom111";
console.log(catname);
console.log("ssss");
return cat;
}
})();
var tom = new ob();
(tom.bb())();
(tom.bb())();
/*******输出结果*******/
tom
ssss
aaa
tom
最外层括号形成块级作用域,建立私有变量和方法,构架ob类,不用var声明使它的作用域提升带全局,再为其添加方法,通过闭包返回私有方法和变量.
(function() {
var nameg = "1";
cat = function(name) {
nameg = name;
};
cat.prototype.setname = function(name) {
// console.log("set");
nameg = name;
};
cat.prototype.getname = function() {
// console.log("get");
return nameg
}
})();
var tom = new cat("tom");
console.log(tom.getname());
tom.setname("tom2");
console.log(tom.getname());
var jay = new cat("jay");
console.log(jay.getname());
console.log(tom.getname());
/*******输出结果******/
tom
tom2
jay
jay