zoukankan      html  css  js  c++  java
  • 闭包面试题

     1 <!DOCTYPE html>
     2 <html lang="en">
     3   <head>
     4     <meta charset="UTF-8" />
     5     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     6     <title>Document</title>
     7   </head>
     8   <body>
     9     <script>
    10       // 1.闭包无处不再,需要你去识别它。基于作用域书写代码时产生的自然结果,我们不需要为了利用它而刻意的去创建一个闭包
    11       // 2.闭包是一种方式,他是一个能够引用其内部作用域变量的表达式
    12       // 3.以下这个案例就是一个闭包,因为匿名函数(say)是在另外一个函数中声明的,在js中如果另一个函数使用了funtion关键字,则创建了闭包
    13       // 4.在js中 如果在一个函数A中声明了另外一个函数B(出现了闭包),那么你调用了A函数以后,A里边的局部变量依然是可以被访问的
    14       /* function sayHello(name) {
    15         var text = name; // 局部变量text
    16         var say = function () {
    17           console.log(text);
    18         };
    19         return say;
    20       }
    21 
    22       var say2 = sayHello("lily");
    23 
    24       say2(); //lily */
    25 
    26       //
    27       /* function say667() {
    28         // 局部变量num最后会保存在闭包中
    29         var num = 42;
    30         var say = function () {
    31           console.log(num);
    32         };
    33         num++;
    34         return say;
    35       }
    36       var sayNumber = say667();
    37       //通常一个函数执行完成以后,整个内部的作用域都会被销毁,因为引擎有垃圾回收机制来释放不在使用的空间
    38       //而闭包的神奇之处就是 可以阻止这个事情的发生,内部作用域依然存在,因为sayNumber还在使用这个作用域
    39       sayNumber(); // 输出 43 */
    40 
    41       //
    42       /* var a, b, c;
    43       function fn1() {
    44         // 局部变量num最后会保存在闭包中
    45         var num = 42;
    46         // 将一些对于函数的引用存储为全局变量
    47         a = function () {
    48           console.log(num);
    49         };
    50         b = function () {
    51           num++;
    52         };
    53         c = function (x) {
    54           num = x;
    55         };
    56       }
    57       fn1();
    58       b();
    59       a(); // 43
    60       c(5);
    61       a(); // 5
    62       var oldLog = a;
    63       //在上边的案例中,当我们再次调用fn1时候,一个新的闭包就被创建了,旧闭包的变量 a b  c被新闭包的函数覆盖
    64       // 每次调用fn1 都会创建一个新的闭包
    65       fn1();
    66       a(); // 42
    67       oldLog(); // 5 */
    68 
    69       //
    70       function buildList(list) {
    71         var result = [];
    72         for (var i = 0; i < list.length; i++) {  //for循环已经执行完了,此时i为3,
    73           var item = "item" + i;
    74           result.push(function () {
    75             console.log(item + " " + list[i]);
    76           });
    77         }
    78         return result;
    79       }
    80       function testList() {
    81         var fnlist = buildList([1, 2, 3]);
    82 
    83         for (var j = 0; j < fnlist.length; j++) {
    84           fnlist[j](); //打印3次  ‘item2 undefined’
    85         }
    86       }
    87       testList();
    88     </script>
    89   </body>
    90 </html>
  • 相关阅读:
    python目录操作【os和os.path】
    Zabbix4.0 zabbix 快速监控主机
    Zabbix 4.0 钉钉报警
    MySql:sql99语法的连接查询
    bat脚本中存在多条指令,但只执行到某条指令不继续向下执行的一种解决方法
    基类与接口类中的虚析构函数(virtual destructor)
    TortoiseGit使用指南;
    Rust编译问题Blocking waiting for file lock on package cache
    win10安装visual C++ 6.0,在最后显示安装程序正在更新您的系统,然后就无响应
    从实现装饰者模式中思考C++指针和引用的选择
  • 原文地址:https://www.cnblogs.com/fsg6/p/12985358.html
Copyright © 2011-2022 走看看