JavaScript必备知识 -- 闭包

举报
阿童木 发表于 2021/08/22 14:49:33 2021/08/22
【摘要】 JS笔记 预编译创建AO对象找函数形参和变量声明,值给undefined实参形参统一在函数体里面找函数声明,值赋予函数体function fn(a){ console.log(a); //在AO里找值--->输出 function a() {} var a = 123; //预编译将 var a,提升上去了,执行 a = 123;修改AO中a的值 console.log(a);...

JS笔记

预编译

  1. 创建AO对象
  2. 找函数形参和变量声明,值给undefined
  3. 实参形参统一
  4. 在函数体里面找函数声明,值赋予函数体
function fn(a){
   console.log(a); //在AO里找值--->输出 function a() {}
   var a = 123; //预编译将 var a,提升上去了,执行 a = 123;修改AO中a的值
   console.log(a); //输出 123
   function a() {} //预编译读过,不再读
   console.log(a); //输出 123
   var b = function() {} //函数表达式,将AO中b的值改为function () {}
   console.log(b); //输出funtion () {}
   function d() {}
}
fn(1);
第一步:AO{ }
第二步:
AO{
a : undefined,
b : undefined
}
第三步:
AO{
a : 1,
b : undefined
}
第四步:
AO{
a : function a() {},
b : undefined,
d : function d() {}
}

立即执行函数

此类函数没有声明,在一次执行过后即释放,可以用来做初始化

var mrDeng = (function(){
    var Deng = {
        name : "MrDeng",
        age : 40,
        sex : "male",
        health : 100,
        smoke : function () {
            console.log('I am smoking! cool!!!');
            this.health --;
        },
        drink : function () {
            console.log('I am drink');
            this.health ++;
        }
    }
    return Deng;
}())

这样可以实现初始化的效果


闭包

内部函数被返回到外部,函数本身保留了父函数的AO,即使父元素执行完了,取消对AO的引用,但依旧被子函数保留下来了,就形成了闭包。

闭包会导致原有作用域链不释放,造成内存泄漏。

作用

  1. 实现公有变量(累加器)

因为子函数保留有父函数的AO,并在此基础上搭建自己的AO,所以父函数的AO会被作为一个公有变量被使用,即使函数执行完毕,也只会销毁自己创建的AO对象。

  1. 实现封装,属性私有化

简单理解就是函数结束会销毁父函数的执行上下文,但是应用闭包可以使父函数的执行上下文被保留下来,给父函数下的其他函数使用,这样就实现了属性的私有化

  1. 模块化开发

  2. 防止污染全局变量

var name = 'abc';//全局变量
var init = (function() {
    var name = 'ljc';
    function callName() {
        console.log(name);
    }
    return function () {
        callName();
    }//返回一个函数形成闭包,留有父函数的AO{name: 'ljc'}
}())
init();//ljc
  1. 缓存(存储结构)

防范

闭包会导致多个执行函数共用一个公有变量,应当尽量避免

利用闭包解决for循环绑定事件的问题

function test(){
   var liCollection = document.getElementByTagName('li');
   for(var i = 0; i < liCollection.length; i++){
      (function (j){
         liCollection[j].onclick = function(){ //把函数绑定到了每个li元素(外部)
            console.log(i);
         }
      }(i))
   }
}
test();
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。