美文网首页
JavaScript作用域和闭包

JavaScript作用域和闭包

作者: 铁匠简记 | 来源:发表于2018-08-06 01:15 被阅读16次

闭包是函数的一种特性 一种现象,它不指代某个具体的语法、定义、概念等,要理解闭包就必须要清楚函数的作用域。

1、词法作用域和激活对象

JS中的函数是通过词法(语法、定义)划分作用域的 而不是动态创建作用域,这就是说函数是运行在它定义时的作用域,而不是执行时的作用域,例如:当嵌套函数从外围函数中被导出时,它的执行地发生了改变 但是作用域不变。
在调用函数时,JS会首先将作用域设为定义时起作用的那个作用域,然后创建一个激活对象添加到作用域链的头部。函数体内的局部变量、定义时的形参、嵌套的函数,都是激活对象的属性。



2、闭包的成因、原理

当嵌套函数被导出时 定义的作用域是如何起作用的呢,这是因为函数定义时 会将作用域链保存起来 并且成为函数内部状态的一部分。
这里嵌套函数返回的值,是存在于外围函数的激活对象中,可是当外围函数调用结束时,外围函数的激活对象会删除,从而使函数恢复之前的状态,这也是我们所期待的。
但是嵌套函数改变了这一规则,当函数体内有嵌套函数时,如果嵌套函数只在函数体内使用(调用),嵌套函数随着外围函数退出(执行完毕)而结束,这也没有任何问题。
可是,如果此时嵌套函数被导出或者存在其他引用,这时外围函数的激活对象就会保留下来。
结果是外围函数的一次特定调用的激活对象中的值被保留下来,这种代码和作用域的综合体称为闭包。(解释了 此处为什么g调用能拿到值)。

3、闭包的应用场景

当嵌套函数被导出 或者存在其他引用时 会发生闭包,那么嵌套函数是如何被导出?
1、将嵌套函数作为返回值;
2、嵌套函数作为外部对象的属性(方法 属性值是一个匿名函数的是方法);
3、使用自调用匿名函数,在闭包中能够帮助我们简化结构,便于处理;
很多时候,我们期望给某段代码一个独立的执行环境,避免与其他部分的代码之间相互干扰,可以将它们放入一个函数中去执行。


自调用匿名函数

4、闭包的使用案例

1、设置一个私有 且 持久存储的数据 例如 一个能不断自增的计数器
很多时候 我们要给某个值自增需要把它设为全局变量 但是这样在全局裸露的环境中 值很容易被篡改 可以考虑将值放入一个局部环境中 存储 但是如何才能维持局部环境中的数据呢 只能通过闭包实现。





2、定义一个访问器 给一个对象 添加一对get/set方法 用来操作对象的属性。



相关文章

  • 2018-01-07 关于javascript闭包和作用域的理解

    关于 javascript 闭包的一些思考 作用域 词法作用域 函数作用域 块作用域 闭包 什么是作用域? 作用域...

  • 学习JavaScript闭包和作用域笔记

    JS JavaScript闭包和作用域 闭包 JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外...

  • 你不可不知道的 JavaScript 作用域和闭包

    原文出处:JavaScript Scope and Closures 作用域和闭包是 JavaScript 中重要...

  • 作用域和闭包

    目录 概述 作用域编译过程词法作用域全局作用域函数作用域 闭包循环和闭包闭包的用途性能 总结 概述 作用域和闭包一...

  • JavaScript中的闭包

    1.什么是闭包 要理解什么是闭包,就得先理解变量的作用域。在JavaScript中,有两种作用域,全局作用域和函数...

  • 作用域、作用域链、闭包、面向对象、执行上下文

    作用域 作用域链 函数的提前声明 闭包 JavaScript 闭包与类(原型链)之间的开发方式 构造函数和普通函数...

  • 2018-07-11

    深入理解闭包: 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非...

  • 《javscript启示录》笔记(下)

    7. 作用域和闭包 a. 在javascript中作用域是执行代码的上下文,分为: 全局作用域 和 局部作用域(函...

  • JavaScript中的闭包

    理解闭包,首先必须理解变量作用域。前面提到,JavaScript 有两种作用域:全局作用域和函数作用域。函数内部可...

  • 作用域闭包

    概览 背景知识:JavaScript内存管理、JavaScript作用域。 内容 1 闭包定义 闭包:当函数可以记...

网友评论

      本文标题:JavaScript作用域和闭包

      本文链接:https://www.haomeiwen.com/subject/rkoivftx.html