百度百科摘要:
闭包就是能够读取其他函数内部变量的函数。例如在 JavaScript 中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
Q1:
function Foo() {
var i = 0;
console.log(i)
return () => console.log(i++);
}
var f1 = Foo(), f2 = Foo();
f1();
f1();
f2();
控制台输出:
分析:
-
此题目的考察点在闭包和引用类型对象,首先
Foo
是引用类型存储在堆中,而变量f1、f2
存储是在栈中; -
var f1 = Foo()
首先Foo()
执行,输出0
,返回一个函数体,f1
指向返回的函数体。
var f2 = Foo()
同样执行Foo()
,和f1
不同的是这是一个新的内存地址,输出0
,返回一个函数体,f2
指向返回的函数体。 -
f1()
第一次执行,即返回的函数体执行,因为自身没有 定义i
,所以向上找父函数定义的i
,输出i++
即为0
-
f1()
第二次执行,再次执行返回的函数体,输出的是父函数的i = 1
,i++
,输仍为1
; -
f2()
第一次执行,f2
执行的是新的Foo()
执行返回的函数体,因此其内部定义的变量和f1
中没有任何关系。其父函数的i
为0
,输出i++
即是0