zoukankan      html  css  js  c++  java
  • js闭包函数

    一. 匿名函数

    javascript中: (function(){})()是匿名函数,主要利用函数内的变量作用域百,避免产生全局变量,影响整体页面环境,增加代码的兼容性。

    (function(){})是一个标准的函数定义,但是没有复制给任何变量。所以是没有名字的函数,叫匿名函数。没有名字就度无法像普通函数那样随时随地调用了,所以在他定义完知成后就马上调用他,后面的括号()是运行这个函数的意思

    二. 闭包示例

    1. 首先立即执行匿名函数获得闭包函数,此时闭包函数可以拿到上一层函数的变量保证不被销毁

    2. 此时counter就类似私有变量,只能通过闭包函数进行修改

    3. 缺点大量内存占用,导致局部变量不会被垃圾回收,严重会导致内存泄漏(内存泄漏是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果)

    var add = (function () {
        var counter = 0;
        return function () {return counter += 1;}
    })();
     
    add();
    add();
    add();
     
    // 计数器为 3

     4. 经典面试题,循环中使用闭包解决 var 定义函数的问题

    首先因为 setTimeout 是个异步函数,所有会先把循环全部执行完毕,这时候 i 就是 6 了,所以会输出一堆 6。

    for ( var i=1; i<=5; i++) {
        setTimeout( function timer() {
            console.log( i );
        }, i*1000 );
    }

    5.  还可以使用 let 定义 i 解决此问题,因为对于 let 来说,他会创建一个块级作用域

    for ( let i=1; i<=5; i++) {
        setTimeout( function timer() {
            console.log( i );
        }, i*1000 );
    }
    作者:dlm17
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    cds.data:=dsp.data赋值有时会出现AV错误剖析
    iOS -- 十进制、十六进制字符串,byte,data等之间的转换
    iOS -- 原生NSStream实现socket
    CA认证原理以及实现(下)
    CA认证原理以及实现(上)
    android -- 存储byte
    iOS -- 字符串(NSString *)转uint8_t的两种方法
    Android -- AsyncTask 使用和缺陷
    Swift oc 混编
    Android -- native关键字
  • 原文地址:https://www.cnblogs.com/dlm17/p/12903993.html
Copyright © 2011-2022 走看看