1、含义
js闭包就是跨作用域访问变量——内部作用域可以保持对外部作用域变量的使用,从而使得更外部的作用域可以访问内部作用域的变量
2、出现原因
函数内部可以访问函数外部作用域的变量,但函数外部不可以访问函数内部,如果想让它访问到,可以使用闭包实现。
注意:外部可以通过闭包函数返回的函数内部而得到函数内部变量
3、为什么使用
局部变量无法共享和长久的保存,而全局变量可能造成变量污染,希望有一种机制可以长久的保存变量却又不造成变量污染。
4、何时使用
变量既想反复使用,又想避免造成全局污染
5、如何使用(函数有三层)
- 外层函数封装被保护的局部变量
- 内层函数执行对外层函数变量的操作
- 外层函数返回内层函数的对象,并且外层函数被最外层调用
//eg:
function user(){
var name = 'zhuhui';
return function getName(){
return name;
}
}
//调用
var userName = user()();
console.log(userName);
6、常见面试题
(1)
var name = 'hy';
function user(){
function getName(){
console.log(name);
}
getName();
}
user();//这里输出hy
- 注意:因为getName函数中没有name,向上查找找到全局作用域中的变量,所以输出 hy
(2)
for(var i =0;i<4;i++){
setTimeout(function(){
console.log(i);
},300);
}
结果:输出 4 个 4。
1.png
原因:js 在执行的 时候都会执行主线程,异步相关的会存在异步队列中,当主线程执行完毕后才会执行异步队列中的,所以打印出来的 是 4 个 4。
修改:使用闭包或者 let
2.png
3.png











网友评论