zoukankan      html  css  js  c++  java
  • javascript闭包和闭包的几种写法和用法

    什么是闭包

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

    1 作为一个函数变量的引用,当函数返回时,其处于激活状态。2 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

    简单的说,javascript允许使用内部函数----即函数定义个函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的局部变量、参数和声明和其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。、

    在javascript中每个函数都有一个Prototype属性,而对象没有。

    1 不使用prototype属性定义的对象方法,是静态方法,只能直接用类名进行调用,另外,此静态方法中无法使用this变量来调用对象其他的属性。

    使用prototype属性定义的对象方法,是非静态方法,只有在实例化之后才能使用,其方法内部可以this来引用对象自身中的其他属性。

    javascript闭包的用途

    模拟面向对象的代码风格,

    1 匿名自执行函数

    let arr1=[1,2,3,4];
    
    (function(arr){
    
    alert(arr.join(","));
    
    })(arr1);

    匿名函数,立即执行,由于外部无法引用它内部的变量,因此在函数执行完之后会立刻释放资源,关键是不污染全局对象。

    结果缓存 封装

     实现类和继承

    我们定义一个Person方法,就像一个类,定义方法继承Person,并添加自己的方法

    function Person(){
    
    this.Name="zhangsan";
    
    this.age=20;
    
    }
    
    let demo=function(){};
    
    demo.prototype=new Person();
    
    demo.prototype.say=function(){alert('this is a say function')}
    
    let a=new demo();
    
    a.age   //20
    
    a.Name //‘zhangsan’
    
    a.say();

    如果一个函数访问了它的外部变量,那么它就是一个闭包,闭包是一个函数,这个函数能够访问其他函数的作用域中的变量

    闭包也会有很多弊端

    function demo(){
    
    var arr=[];
    
    for(var i=0; i<10;i++){
    
    arr[i]=function(){
    
      console.log(i);
    
    }
    
    }
    
    }
    
    let arr=demo();
    
    arr.map(fn=>{
    
      fn();
    
    });

    结果打印的都是10;因为内部函数访问外部的变量,内存中i没有释放;想要达到预期的效果,可以改成如下:

    function demo(){
    
    var arr=[];
    
    for(var i=0; i<10;i++){
    
    arr[i]=function(num){
    
      return function(){
    
        console.log(num);
      }
    
    }(i);//立即执行的匿名函数,执行完之后就释放i的引用
    
    }
    
    }
    
    let arr=demo();
    
    arr.map(fn=>{
    
      fn();
    
    });

    结果打印的是1 2 3 4 5 6 7 8 9

  • 相关阅读:
    [Graph]Doubling Algorithm
    Luogu 3203 BZOJ 2002——弹飞绵羊
    BZOJ 1468——tree
    BZOJ 10628 Luogu 2633
    Mo's Algorithm
    bzoj1063: [Noi2008]道路设计
    bzoj1264: [AHOI2006]基因匹配Match
    bzoj1177: [Apio2009]Oil
    bzoj1260: [CQOI2007]涂色paint
    bzoj3674: 可持久化并查集加强版
  • 原文地址:https://www.cnblogs.com/xiaofenguo/p/10530546.html
Copyright © 2011-2022 走看看