后端重新学习前端第四天

争取在16号之前将js基础看完吧,耶稣也留不住我,我说的。
今天主要学习了一些关于立即执行函数扫尾和作用域的扫尾。预计明天会学到对象和this。加油

立即执行函数扫尾

function test(){
  var arr = [];
  for (var i = 0; i < 10; i++) {
    arr[i] = function () {
      console.log(i);
    }
  }
  return arr;
}
var myArr = test();
for (var j = 0; j < myArr.length; j++) {
  myArr[j](); // 这里打印了10次10
}
复制代码

由于test函数里的arr被保存到了外部,此时形成了闭包而且是10个函数的布包;根据昨天的知识,闭包的作用域是其定义的作用域,故此时执行时作用域内的i是循环之后的值,即10。所以上面的代码会打印10次10。

如果要使其顺序打印,就要封闭其作用域,使每一个函数访问的是当前作用域下的i即可。

1、使用let等可以封闭作用域的关键字生命循环变量i

2、使用立即执行函数提前使用i

// 方法一
function test() {
  var arr = [];
  for (let i = 0; i < 10; i++) {
    arr[j] = function () {
      console.log(j);
    }
  }

  return arr;
}

// 方法二
function test() {
  var arr = [];
  for (var i = 0; i < 10; i++) {
    (function (j) {
      arr[j] = function () {
        console.log(j);
      }
    })(i)
  }

  return arr;
}
复制代码

解析方法一:由于let具有封闭作用域的作用,所以let能够很好的使arr每个函数访问到自己当前作用域的i变量。

解析方法二:每一次循环会产生一个新的立即执行函数,使每一个函数的作用域都不同,造成其访问的i都不同,故也可解决。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享