JavaScript——闭包(作用域)

作用域

变量的作用域无非就是两种:全局变量和局部变量;

局部变量:

在函数体中声明的变量,只能在该函数体中访问。

全局变量:

除了函数体中声明的变量,或者在函数体中没有var子变量,在任何地方都可以访问该变量。

  • 因为每个js函数都是一个对象;独享中有些属性侍卫们可以访问的;但是有些不能被访问;这些属性近视提供JS引擎存取; scope就是其中一个
  • scope是代表的就是作用域其中存储了运行期上下文的集合
  • 作用域链:
    在scope中所有存储执行期上下文的对象的集合;这个集合呈链式链接,这就是作用域链;
    执行期上下文属于预编译的环节;概念是:当函数执行时,会创建一个执行期上下文的内部对象,一个执行期上下文定义了一个函数的执行是的环境,函数每次执行时对应的执行上下文都是独一无二逇,多以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕,它所产生的执行上下文被销毁
    每次执行完毕后;就会产生一个AO,;指向完毕后AO就会被销毁
  • 作用域链的执行;是先从自己的scopt中找,如果找不到,就是去自己的上层函数作用域中找,依次类直到找到window对象下的作用域
  • 在一个作用域内;所有的函数和变量的声明
    都会被JS提升到这个作用域的顶部。可能在函数;匿名函数赋值调用这种形式无法提升;仅仅是提升了那个得到匿名函数的变量
  • 查找变量:从作用域连的顶端一次乡下查找

立即执行函数

初始化数据:可以用立即执行函数
只有表达式才能内执行
运算符+函数 = 等于表达是

闭包的概念

闭包就是能够读取其他函数内部变量的函数;

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁

什么是闭包?

多个函数互相嵌套;把里面函数保存到了外部(全局),导致里面的函数如果在外部执行的时候一定能够调用的了原来他所在函数里面的变量;这就导致了;局部变量可以呗全局访问

当内部函数被保存到外部时;将会生成闭包,闭包贵导致原有作用域链不释放。造成内存泄露

闭包的防范:

闭包贵导致对个执行函数共同一个工友的变量,如果不是特殊需要;应尽量防止这种情况的发生

闭包的作用:

1:实现公有变量 ;例如函数累加器
不依赖于外部变量并且能反复执行的函数累加器
2 可以缓存 (储存结构) eater
当多个函数和一个函数形成闭包;下一个执行的会在上一个保存的基础上进行的保存
案例;向数组中装10个函数
3: f封装实现是私有化
4:模块化开发,防止污染全局变量

一个代码一个块

简单化就是:

一个是可以读取函数内部的变量;
另一个就是让这些变量的值始终保持在内存中;

闭包注意点

1.由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题
2.闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值