下面都是干货,涉及JavaScript高级开发的基础知识。如果有理解上的错误,欢迎指出。
最初级的闭包
下面是一个简单的计数器。
function Counter(initNum){
var num = parseInt(initNum);
return function() { num += 1; return num; };
}
var counter = new Counter(12);
console.log(counter());//12 + 1 = 13
console.log(counter());//13 + 1 = 14
console.log(counter());//14 + 1 = 15
console.log(counter());//15 + 1 = 16
我们可以看到储存当前次数的变量藏在函数Counter
内;函数Counter
内部返回一个匿名函数
,每一次调用counter()
都会执行一次这个匿名函数,其作用域在Counter下,实现对计数器counter2数字加1的功能。
稍作改进的计数器
function Counter2(initNum){
var num = parseInt(initNum);
this.get = function() { return num; }; //获取当前次数
this.add = function(){
return function() { num += 1; return num; }}; //num++
}
var counter2 = new Counter2(0); //initial
console.log(counter2.add()()); //1
console.log(counter2.get()); //1
console.log(counter2.add()()); //2
console.log(counter2.add()()); //3
console.log(counter2.get()); //3
我们可以看到,Counter2下的方法add
返回一个匿名函数,匿名函数内部同第一个例子,num
为Counter2内的局部变量,匿名函数的作用域还是在counter2下,所以一样实现了对计数器counter2数字加1的功能。
计数器中作用域的差异
下面的内容涉及this
的差异。请看Rebecca Murphey关于this关键字
的阐述: