构造函数中的作用域
<script>
function Hd() {
let n = 1;
return function a() {
let m = 1;
return function b() {
console.log('n:', ++n);
console.log('m:', ++m);
}
b();
}
a();
}
let c = new Hd();
c()();
c()();
</script>
问程序执行会输出什么?(结尾附图解)
Hd是一个构造函数,Hd会返回a函数;
调用 let c = new Hd(); 此时会新开辟的一块内存空间,用来存放返回值,存放的是:
function a() {
let m = 1;
return function b() {
console.log('n:', ++n);
console.log('m:', ++m);
}
b();
}
- 重点来了,如果再次调用 let d = new Hd();那么内存会再开辟一块内存空间,也就是c和d中的代码时两家人,可以说他们是远房亲戚了,看似有联系,其实变量n, m,b函数都是独立的。(当然本篇文章没有执行此代码)
- 我们继续走第一次调用c()();代码从到又,先执行c(),返回一个函数b,再执行b();所以首先输出n:2, m:2;
- 第二次调用c()();先执行c(),返回一个函数b,这个函数b和上一个返回的函数b也属于是远方亲戚,所以输出n:3, m:2;
有小伙伴会问了,为什么n会可以累加,m不行,那是因为
c()();
c()();
第一行生成了一个a函数的实例,第二行又生成了一个a函数的实例,相当于有两个a函数,两个独立的m变量,但是n变量还是用的同一个n变量,n变量是Hd实例下的变量。也就是说这两个返回的a函数的妈妈都是同一个,都是一个Hd实例。