1.闭包
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现, 闭包简单的理解就是一个作用域中访问另一个作用域中的变量. 一般情况是一种函数嵌套,内置函数访问外部函数的变量。构成闭包
闭包形成条件 (函数嵌套,内部函数调用外部函数的变量)
/*
闭包的形成条件
1.函数嵌套
2.内部函数调用外部函数变量
*/
function fn(){
let age = 18;
let myName = "鲁班";
function fun(){
console.log(age);
console.log(myName);
}
fun();
}
fn();
/*
闭包就是一个对象 {key:value}
*/
//将内部函数返回
function fn(){
let age = 20;
return function (){
console.log(age);
}
}
let fn1 = fn();
fn1(); //20 闭包的作用:延长变量的作用域链
闭包小案例:
function fn(){
let count = 0;
return function(){
count++;
console.log(count);
}
}
let fn1 = fn();
fn1(); //1
fn1(); //2
fn1(); //3
fn1(); //4
fn1(); //5
fn1(); //6
fn1(); //7
//由于作用域链延长 好处:局部变量 不影响全局但可以实现自增。
闭包总结:
闭包的优点:
1.隐藏变量,避免全局污染
2.可以读取函数内部的变量
闭包的缺点:
1.导致变量不会被垃圾回收机制回收,造成内存消耗
2.不恰当的使用闭包可能会造成内存泄漏的问题
防止闭包造成内存泄漏
window.addEventListener('load',function(){
let btn = document.querySelector(".btn");
let value = btn.innerHTML;
btn.addEventListener('click',function(){
console.log(value);
})
btn = null;
})
//使用完 讲变量设置成null 等待下一次垃圾回收器回收。
闭包的应用
//形成一个沙箱环境。 模块化实现
(function(window){
let name = "ztf";
let age = 10;
function getName(){
return name;
};
function getAge(){
return age;
}
window.Info = {
getName:getName
}
})(window)
面试题1:
function fn(){
let a = 10;
return (function(num){
return num;
})(a)
}
let fn1 = fn();
console.log(fn1); ?
面试题2:
for (var i = 0; i < 3; i++) {
setTimeout(function log() {
console.log(i); // => ?
}, 1000);
}
面试3:
function fun(n,o) {
console.log(o)
return {
fun:function(m){
return fun(m,n);
}
};
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1); c.fun(2); c.fun(3);//undefined,?,?,?
//答案:
//a: undefined,0,0,0
//b: undefined,0,1,2
//c: undefined,0,1,1