zoukankan      html  css  js  c++  java
  • js中的闭包

    前言:市面上对闭包的理解:(不同的人对闭包的理解不尽相同)
    1.一个函数就是一个闭包
    2.闭包就是让内部函数可以访问外部函数的参数或者变量,这个值是不会被浏览器垃圾回收机制回收

    js中的闭包理解:
    js有个特性,函数开了一个新空间,里面的变量、私有属性都不会被外界干扰.(封闭空间)
    (function(){ })()
    闭包:
      函数套函数,子函数使用父函数的参数或者变量,并且子函数被外界所引用(没释放)
      这个时候,父函数的参数或者变量不会被垃圾回收机制回收,此时在浏览器(chrome)
      中打印父级的返回值,在scopes下多了一个closure,closure就叫闭包。
    1     function fn(a) {
    2         return function f(){//函数套函数
    3             a++//子函数使用父函数的变量或者参数
    4         }
    5     }
    6     abc = fn(1);
    7     console.dir(abc);//scopes下多了一个closure,closure就叫闭包。

    为什么要用闭包?
    就是为了函数体内的参数或者变量不会被垃圾回收机制回收(保留下来)

    函数体内的参数或者变量什么时候被销毁?
    函数执行:(五步)
    1.开了一个空间(新的作用域)
    2.参数赋值
    3.预解析(变量提升)
    4.从上到下执行上下文
    5.局部作用域销毁
    当直接调用完函数,函数就自动被回收了(包括函数内的参数、变量)

    闭包的作用(应用场景):
      1.私有变量不被外界所干扰(互相不冲突)
    在多人开发的时候,在全局作用域下难免会遇到名字重复的情况。(全局污染)
      2.存储父函数的参数或者变量 (不被浏览器的垃圾回收机制回收)
    解决:
      可以使用封闭空间
      (function(){})()
      可以使用命名空间
      把变量变成属性、把函数变成方法
    1 var xxx = {//xxx是我独有的且不和别人重复的名字。
    2               fn:function (){
    3                   // alert(1);
    4                   console.log(this);//我的对象
    5               },
    6               a:10
    7           };
    8           xxx.fn(); //执行方法
    
    
    封闭空间缺点:
    外面想用函数内的运算结果,是不能直接访问到的。

    解决:
    return 出去,外面接受一个返回值
    或挂window下

    1   var obj = (function(){
    2         window.a = 1
    3         ...
    4         return {
    5         a,b,c
    6      }
    7      })();
    扩充知识点:
    变量、属性 的区别:
    变量前面没主(默认主为window)
    属性前面有主(主就是.前面的对象)

    函数、方法 的区别:
    函数前面没主(默认主为window)
    方法前面有主(主就是.前面的对象)
    1 let a = {}  //a变量
    2 window.name= " "  //属性
    3 
    4 function fn(){...} //函数
    5 string.substring();//方法
    6 arr.push() //点儿 . 前面的就是主
  • 相关阅读:
    HDU 5486 Difference of Clustering 图论
    HDU 5481 Desiderium 动态规划
    hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值
    HDU 5478 Can you find it 随机化 数学
    HDU 5477 A Sweet Journey 水题
    HDU 5476 Explore Track of Point 数学平几
    HDU 5475 An easy problem 线段树
    ZOJ 3829 Known Notation 贪心
    ZOJ 3827 Information Entropy 水题
    zoj 3823 Excavator Contest 构造
  • 原文地址:https://www.cnblogs.com/MrZhujl/p/9865365.html
Copyright © 2011-2022 走看看