今天看到了一段关于闭包的代码:
代码片段A:
!function(){
var num=1;
var exp={};
function add(num){
return num++;
}
exp.getAddNum=function(){
return add(num);
}
window.a=exp;
}()
console.log(a.getAddNum()); // 1
console.log(a.getAddNum()); // 1
代码片段B:
!function(){
var num=1;
var exp={};
function add(){
return num++;
}
exp.getAddNum=function(){
return add();
}
window.a=exp;
}()
console.log(a.getAddNum()); // 1
console.log(a.getAddNum()); // 2
谁能解释下这2段代码的区别吗?考验大家基本功的时候到啦~~~~
第一个里面是你传递进去的,他会使用当前作用域接收到的这个形参的值,它并没有去改变外层num的值,因此你每次用它来传递,值都是1。
而第二个的'add'方法中并没有num变量,他会通过作用域链找到外层的num,那么你这样调用时每次都是操作的外层变量的值,而这个值在你
return
之后是会累加的。关于上下文和作用域链你可以看看这篇文章
图解Javascript上下文与作用域