JS中,什么是闭包?闭包有什么好处?

相信网上对闭包有很多的解释,毕竟这个玩意儿是仁者见仁智者见智,对于我来说,总结了2个特性:

1.函数嵌套函数,内部函数可以引用外部函数的参数和变量

function  aaa() {
    var a = 5;
    function bbb() {
        alert(a)
    }

    return bbb
}
var c = aaa();
c();

2.参数和变量不会被垃圾回收机制所收回

JS中的垃圾回收机制

  function test(){
        var a = 1;
        alert(a)
  }
  test(); // 执行完这个函数,函数里面的a就不存在了,

 

下面来扯一下闭包的好处:

1.希望变量长期驻扎在内存当中(一般函数执行完毕,变量和参数会被销毁)

2.避免全局变量的污染

 function  aaa() {
       var a = 1;
       a++;
       alert(a)
 }

aaa(); // 2
aaa(); // 2
aaa(); // 2
上面的函数不管执行几次,弹出的都是2,如果我们想弹出2/3/4 这样的结果呢?就需要用到闭包
  function aaa() {
        var a = 1;
        return function(){
            a++;
            alert(a)
        }
    }

    var bbb = aaa();
    bbb(); // 2
    bbb(); // 3
    bbb(); // 4

    // 函数表达式的写法
    var aaa = (function () {
        var a = 1;
        return function () {
            a++;
            alert(a)
        }
    })()

    aaa() // 2
    aaa() // 3
    aaa() // 4

原文地址:https://www.cnblogs.com/0955xf/p/12634418.html

时间: 2024-10-27 00:25:24

JS中,什么是闭包?闭包有什么好处?的相关文章

JS中的作用域和闭包

作用域:在编程语言中,作用域控制着变量与参数的可见性及生命周期.JS确实有函数作用域,那意味着定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的. var a = 1; var fs = function (){ var b = 2; var c = 4 var fun = function (){ var c = 3; alert(a) //输出1 alert(b) //输出2 alert(c) //输出3 } fun(); } f

JS中的函数与闭包

JavaScript中的函数由于其独特的功能和特性大大增强了JS的编程实力.在JS中函数也是对象,所以可以为它添加属性和方法,但typeof操作符对函数返回字符串’fnuction’,原生的toString()方法返回代表这个函数的源代码. 一.函数的实质      函数本身也是JS中创建的一种变量(准确分类为对象),它由一系列可执行代码+name属性+形参列表组成.函数可以通过name属性或者变量名来调用.函数具有函数作用域,相对于全局作用域对程序执行环境的变换进行控制. 二.函数的定义   

解析js中作用域、闭包——从一道经典的面试题开始

如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎么写,是不是这样? 可是结果呢,弹出来的都是10,为啥? var i,a for(i=0;i<10;i++){ a=document.createElement('a') a.innerHTML=i+'<br>' a.addEventListener('click',function(eve

谈谈我对JS中this的理解

好吧,JS中,作用域.闭包和原型都说了,今天我们就谈谈this吧,this我更倾向于把它理解成为一个特殊变量,JS解释器在创建任何活动对象时(参考前面关于作用域的博文),都会创建一个this变量,并且将它指向一个对象(可编码干预).下面以代码为例进行讲解. 处于全局作用域下的this: this;/*window*/ var a = {name: this}/*window*/ var b = [this];/*window*/ 在全局作用域下,this默认指向window对象. 处在函数中的t

js中的匿名函数与必包

之前就看过关于js中匿名函数与闭包的文章,始终是不太明白,今天看<JavaScript高级编程第二版>时又看到了这方面的介绍,终于弄懂了. 所谓匿名函数就是没有名字的函数,也叫lamda函数,这不是js所有的,其它很多高级编程语言都有匿名函数.正常情况下函数应该这样定义: 1 function fun1(){ 2 alert("这是一个正常的函数"); 3 } 这就是函数的声明与实现.而匿名函数是这样定义的: 1 var fun1 = function(){ 2 alert

对js中闭包,作用域,原型的理解

前几天,和朋友聊天,聊到一些js的基础的时候,有一种‘好像知道,好像又不不知道怎么讲的感觉’...于是捡起书,自己理一理,欢迎拍砖. 闭包 理解闭包首先要理解,js垃圾回收机制,也就是当一个函数被执行完后,其作用域会被收回,如果形成了闭包,执行完后其作用域就不会被收回. 如果某个函数被他的父函数之外的一个变量引用,就会形成闭包 闭包的作用,就是保存自己私有的变量,通过提供的接口(方法)给外部使用,但外部不能直接访问该变量. 例子(使用闭包): var test=(function(){ var

js中的闭包

对于没有接触过闭包的初学者来说,很难见名知义马上理解什么是闭包.所以首先我们要明确一下什么是闭包.我们先来看一下官方对于闭包的解释:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.看了这个官方的解释,大家对于闭包理解了吗?反正当我看到这个解释的时候是一脸蒙逼,不知道这说的是些什么鬼.因为看到这个解释我很难把闭包和我平时在js中进行的一些操作联系到一起更谈不上学会应用闭包了.可以说闭包是js中的一个难点,难就难在它很

关于js中闭包的理解

1.以前很不理解js中闭包的概念及使用,下面来看一下 function foo() { var a = 123; var b = 456; return function () { return a; } } var fn = foo(); 上面的代码只能访问 a和b,但是不能修改,这是js中闭包的技术之一 function foo() { var a = 123; var b = 456; return { get_a: function () { return a; }, set_a: fu

js中的闭包之我理解

闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的理解以及js内部解释器的运作方式的描述,都是可以看出你js实际水平的.即使你没答对,也能让考官对你的水平有个评估.那么我先来说说我对js中的闭包的理解. 闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等. 在理解闭包以前.最好能