//闭包引起的bug
function bug() {
???var nums = [];
???for (var i = 0; i < 3; i++) {
???????nums[i] = function () {
???????????return i;
???????};
???}
???return nums;
}
var nums_bug = bug();
console.log(nums_bug[0]());
console.log(nums_bug[1]());
console.log(nums_bug[2]());
//修复bug
function fbug() {
???var nums = [];
???for (var i = 0; i < 3; i++) {
???????nums[i] = (function (i) {
???????????return i;
???????})(i);
???}
???return nums;
}
var nums = fbug();
console.log(nums);
//nums[0](); 0
//nums[1](); 1
//nums[2](); 2
//隔离变量作用域
(function(){
???var name = "zs";
???function a(){
???????name = ‘sss‘;
???}
})();
(function(){
???var name = "ls";
???function a(){
???????name = ‘vvv‘;
???}
})();
//计数器
//普通实现
var num = 0;
function countNum(){
???num ++;
}
countNum();
console.log(num);
//闭包实现
var counter = (function(){
???var counterPer = 0;
???return function(){
???????return counterPer++;
???}
})();
console.log(counter());
var counter=(function(){
???//赋初值
???var count=0;
???//外部调用时形成闭包
???return function(){
???????return count++;
???}
})();
//声明私有变量
/*function People(){
???this.name = ‘张三‘;
}
var p = new People();
console.log(p.name);*/
//直接可以.来进行访问,这是公有属性,安全性差
//私有属性是通过.访问不到的
var People = (function(){
???var name = ‘‘;
???function People(){
???}
???People.prototype = {
???????getName : function(){
???????????return name;
???????},
???????setName : function(newName){
???????????name = newName;
???????}
???}
???return People;
})();
var p = new People();
//this
var test = ‘李四‘;
function th_test(){
???console.log(this.test);
}
function bth_test(){
???var test = ‘王五‘;
return function(){
???console.log(this.test);
}
}
//this永远指向调用它的对象
js闭包
原文地址:https://www.cnblogs.com/staticed/p/8549582.html