zoukankan      html  css  js  c++  java
  • 闭包

    // 定时器是异步编程:每一轮循环设置定时器,无需等定时器触发执行,继续下一轮循环(定时器触发的时候,循环已经结束了)
      for (var i = 0; i < 10; i++) {
        setTimeout(() => {
          console.log(i);
        }, 1000);
      }

    // => let 存在块级作用域,每次循环都会在当前块作用域中形成一个私有变量i
    // => 当定时器执行的时候,所使用的 i 就是所处块作用域中的 i
      for (let i = 0; i < 10; i++) {
        setTimeout(() => {
          console.log(i);
        }, 1000);
      }

    // => 1、闭包解决
      for (var i = 0; i < 10; i++) {
        ~function (i) {
          setTimeout(() => {
            console.log(i);
          }, 1000);
        }(i);
      }

    // => 2、闭包解决
      for (var i = 0; i < 10; i++) {
        setTimeout(((i) => {
          return () => {
            console.log(i);
          }
        })(i), 1000);
      }
      for (var i = 0; i < 10; i++) {
        setTimeout((i => () => console.log(i))(i), 1000);
      }

    // => 3、基于 bind 的预先处理机制:在循环的时候就把每次执行函数需要输出的结果,预先传递给函数即可
      var fn = function (i) {
        console.log(i)
      }
      for (var i = 0; i < 10; i++) {
        setTimeout(fn.bind(null, i), 1000);
      }
  • 相关阅读:
    C# 如何得到局域网中的计算机名?
    设计模式之Factory(转帖)[学习用]
    byte类型特殊的地方
    原码、反码和补码
    由Public key生成Public key token
    .Net位运算符&,|,!,^,<<,>>
    强命名程序集,签名,延迟签名
    把16进制字符转换成byte数组
    SHA1哈希算法
    .NET工具篇(四)—SN.EXE
  • 原文地址:https://www.cnblogs.com/HYTing/p/12621307.html
Copyright © 2011-2022 走看看