资讯专栏INFORMATION COLUMN

浅析js闭包

cnio / 2757人阅读

摘要:在中,变量只有两种,全局变量和局部变量。这里要注意的是定义局部变量必须加上,否则定义了全局变量。上面也可以这样实现那么闭包的特点是什么呢首先是之前一直在强调的可以访问一个函数的局部变量。

**什么是闭包?**

闭包是指所有能够读取其他函数内部变量的函数。在JavaScript中,变量只有两种,全局变量和局部变量。区别在于任何函数都可以直接对全局变量进行访问,而局部变量则只有当前函数以及定义在该函数内部的函数可以进行访问。

访问全局变量如下:

var a = 1;
function show() {
    console.log(a);
};

var showTest = show(); //1 此时函数访问的是全局变量a

但是如果是在函数内部定义了变量a,那么在函数外部是不可访问的。这里要注意的是定义局部变量必须加上var,否则定义了全局变量a。

function show() {
    var a = 100;
};

console.log(a) //此时会报错,a未定义

那么想访问函数内部的变量a有什么方法呢,不考虑直接返回变量a的情况。因为内部函数可以通过作用域链访问到父函数的局部变量,那我们是不是可以在函数内部定义一个函数来读取a呢?

function show() {
    var a = 100;
    var inShow = function() {
        console.log(a);
    };
    return inShow;
};

var showTest = show();
showTest(); //100

这就是闭包,通过内部函数访问父函数的变量,再通过返回内部函数,使可以在外部访问函数的局部变量。上面也可以这样实现

function show() {
    var a = 100;
    return function() {
        console.log(a);
    };
};

var showTest = show();
showTest(); //100

那么闭包的特点是什么呢?

首先是之前一直在强调的可以访问一个函数的局部变量。

可以使变量一直存在内存中。怎么理解呢?如上例子中,我们通过返回inShow函数,并将其赋值给一个全局变量showTest,从而使得函数inShow一直存在内存中,而inShow是函数show的内部函数,所以函数show也存在内存中,不会被销毁。

因此使用闭包时要注意不能滥用,可能造成性能较差,ie中出现内存泄露等问题。因此在退出函数时,可以通过删除不常使用的常量来缓解这一情况。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96570.html

相关文章

  • 浅析Vue响应式原理(三)

    摘要:响应式原理之不论如何,最终响应式数据都要通过来实现,实际要借助新增的。在函数内,首先实例化一个实例,会在稍后添加为响应式数据自定义的中发挥作用。只有数组和对象才可能是响应式,才能返回实例。参考链接技术内幕揭开数据响应系统的面纱源码 Vue响应式原理之defineReactive defineReactive 不论如何,最终响应式数据都要通过defineReactive来实现,实际要借助...

    tomener 评论0 收藏0
  • PHP容器--Pimple运行流程浅析

    摘要:实际上,闭包和匿名函数是伪装成函数的对象。容器流程浅析是社区中比较流行的容器。服务提供者服务提供者是连接容器与具体功能实现类的桥梁。服务提供者需要实现接口所有服务提供者必须实现接口方法。但已经完成了服务提供者的注册工作。 需要具备的知识点 闭包 闭包和匿名函数在PHP5.3.0中引入的。 闭包是指:创建时封装周围状态的函数。即使闭包所处的环境不存在了,闭包中封装的状态依然存在。 理论上...

    RobinTang 评论0 收藏0
  • 浅析 PHP 闭包

    摘要:闭包也叫匿名函数引入。建议在代码结构比较乱,需要封装的时候使用。希望此文能帮到未曾使用或者对的闭包有疑问的同学,同时如果有不对的地方欢迎支出。 闭包也叫匿名函数 PHP5.3 引入。 使用方法 需要调整数组元素中的值 php$data = range(0, 100);//想要每个元素的值都加上.html的后缀 $suffix = .html; function makeSu...

    focusj 评论0 收藏0
  • 【V8引擎】浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    摘要:一前言的垃圾回收机制使用垃圾回收机制来自动管理内存。垃圾回收器只会针对新生代内存区老生代指针区以及老生代数据区进行垃圾回收。分别对新生代和老生代使用不同的垃圾回收算法来提升垃圾回收的效率。 V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制。因此,V8 将内存(堆)分为新生代和老生代两部分。 一、前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存。垃...

    qingshanli1988 评论0 收藏0
  • koa2 总体流程原理浅析(二) 之 中间件原理

    摘要:任何一层报错,都能用捕获总结是一个非常轻量级的框架,只实现了中间件处理流程和对对象的封装。其他的功能都由外部中间件提供。 koa 的中间件机制巧妙的运用了闭包和 async await 的特点,形成了一个洋葱式的流程,和 JS 的事件流 (捕获 -> target -> 冒泡) 相似 handleRequest(ctx, fnMiddleware) { const res ...

    zhoutk 评论0 收藏0

发表评论

0条评论

cnio

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<