当前位置: 首页 > news >正文

JS闭包

  什么是js(JavaScript)的闭包原理,有什么作用?

一、定义

官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

 

很显然,丫的。。。。。啥啊!砸门农村人看不懂!!!

所以小编的理解是这样的:****定义在函数中的函数,并且可在外部访问得到。(正常情况下我们是无法访问局部函数   的)这就有点儿类似脱了裤子放屁的意思,多此一举,可是并非多此一举。闭包肯定有   它的作用的。

 

作用:1、可以减少全局变量的对象,防止全局变量过去庞大,导致难以维护

   2、防止可修改变量,因为内部的变量外部是无法访问的,并且也不可修改的。安全

   3、读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。 

二、例子:(js代码)

1.Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 

var n=999;   

  function f1()

{     

  alert(n);   

}   f1(); // 999
2.另一方面,在函数外部自然无法读取函数内的局部变量。 
  function f1()

{    

   var n=999;  

}   

alert(n); // error
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量! 
  function f1()

{     

  n=999;   

}   

  f1();   

alert(n); // 999

 

*****如何从外部读取局部变量? 

我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。

 

function f1()

{     

  n=999;     

  function f2()

  {       

  alert(n); // 999     

  }   

}

三、使用闭包的注意点 
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。 

2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便 改变父函数内部变量的值。 

转载于:https://www.cnblogs.com/l5580/p/5993223.html

相关文章:

  • 【服务器环境搭建-Centos】jdk的安装
  • Linux 性能基准测试
  • 那些年我们学Flask-SQLAlchemy,实现数据库操作,分页等功能
  • Java设计模式—建造者模式
  • 集群基础之LVS的基础概念
  • mqtt
  • 不做竞价,我们还能做哪些平台?
  • ThinkSNS开源社交系统安装问题及解决措施
  • mysql主从复制的配置总结
  • 关于LOG4J中的日志级别TRACE
  • gdb调试python
  • three.js正交投影照相机
  • 5个月估值翻番超400亿美元,“阅后即焚”Snapchat欲IPO
  • Swift的++
  • 构建自己的PHP框架--构建模版引擎(1)
  • 【刷算法】求1+2+3+...+n
  • CSS实用技巧
  • Cumulo 的 ClojureScript 模块已经成型
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • ECMAScript入门(七)--Module语法
  • go append函数以及写入
  • iOS | NSProxy
  • JavaScript异步流程控制的前世今生
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux下的乱码问题
  • TypeScript实现数据结构(一)栈,队列,链表
  • XML已死 ?
  • 测试如何在敏捷团队中工作?
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 聊聊hikari连接池的leakDetectionThreshold
  • 如何利用MongoDB打造TOP榜小程序
  • 用jQuery怎么做到前后端分离
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #stm32整理(一)flash读写
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (HAL库版)freeRTOS移植STMF103
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (SpringBoot)第七章:SpringBoot日志文件
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)appium-desktop定位元素原理
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)ORM
  • (转载)Linux网络编程入门
  • .describe() python_Python-Win32com-Excel
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .Net各种迷惑命名解释
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • ??myeclipse+tomcat
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题