作用域链就是一层一层往上找,直到找到全局作用域还没有,就宣布放弃,这一层一层的关系就叫作用域链。
闭包会导致作用域链问题,“函数套函数,内层函数对外层函数变量的引用”。
let name = 'ao'
let obj = {
name:'bo',
method:function(){
// let _this = this 将this指向当前对象
return function(){
return this.name
}
}
}
console.log(obj.method()()) //ao
/*
在调用obj.method()函数时,会返回一个匿名函数,而匿名函数返回的是this.name 用到了this属性,
在匿名函数当中,this相当于一个外部变量,所以会形成闭包。
在JavaScript中,this指向函数调用的实体,而匿名函数的实体全是全局的window,因此输出的 是’ao’
如果想要输出obj中的’bo’,就要改变this的指向。将其指向this对象本身
闭包如果使用和理,在一定程度上能够提高代码的执行效率,如果不和理就会造成内存浪费,性能下降
优点:1.保护函数内部变量的安全,实现封装,防止变量流入其他环境发生命名冲突,造成环境濡染
2.可以在内存中维护变量并缓存(使变量不被垃圾回收机制回收),提高执行效率
缺点:1. 消耗内存,函数的活动对象会随着执行上下文环境一起销毁,但是由于闭包引用的是外部函数的活动对象,
因此这个活动对象无法被销毁,这就意味着闭包逼普通函数要消耗更多的内存
2. 在ie9 之前,如果闭包中引用了DOM对象,则意味着DOM对象无法被销毁,则会造成内存泄漏
*/
function dom() {
let ele = document.getElementById('ele')
ele.onclick = function(){
console.log(ele)
}
}