闭包的概念: 闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的用途:闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
面试中笔试题1:
for (var i = 1; i <= 5; i++) {
setTimeout( function timer() {
console.log(i);
}, 1000 );
}
上面的代码会输出什么?怎么改动上述代码,使其依次输出1、2、3、4、5
答案是 后面每隔1000毫秒输出一个6
如何理解:
凡是类试for循环中嵌套一个方法都会将其存入内存中,等待for循环执行完毕再一次执行该嵌套方法,非闭包下for循环每次到得 i 就立即释放 此时完毕 i 理应为5 然而闭包下变量的值始终保持在内存中,i执行到5时还要再去执行一次 i++用于判断 i <= 5的条件 此时 i 就等于6了,此时 console.log(i)中的 i 是从内存中读取的
如何输出使其依次输出1、2、3、4、5让其立即执行
for (var i = 1; i <= 5; i++) {
(function(i){
setTimeout( function timer() {
console.log(i);
}, 1000 );
})(i);
}
或使用块级作用域--关键字let
for (let i = 1; i <= 5; i++) {
setTimeout( function timer() {
console.log(i);
}, 1000 );
}
面试中笔试题2:
function foo(x) {
var tem=3;
return function (y) {
alert(x+y+(++tem))
}
}
var bar=foo(2);
bar(10); //16
理解:
var bar=foo(2);等效于
var tem=3;
var bar=function (y) {
var x=2;
alert(x+y+(++tem))
}
bar(10);等效于:
var tem=3;
var y=10
var bar=function (y) {
var x=2;
alert(x+y+(++tem))
}
网友评论