前端学习让前端飞

踩坑——js闭包造成的问题

2016-10-30  本文已影响1116人  webCoder

由于这3个月工作忙,好久没有在简书上写文章了,今天给大家分享一个我在项目中遇到的js闭包的坑。

假设我有一个变量totalNum,用于保存每一次接口返回的数据总数;
$.ajax({
    url: '.../orders/my',
    data: {
     num: totalNum,
     ...
    },
    type: 'get',
    cache: false
  });

在实际的项目中,我定义了一个reducer变量用于保存这个数据总数,在接口的成功回调函数中,会修改这个reducer。我天真的以为:

我一开始在state中取到的这个reducer数据(totalNum),虽然在window.onscroll中绑定了,但每次scroll时,都会重新从state中取最新的totalNum。

上面的描述可能比较抽象,下面列出了一个很简单的模型:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script type="text/javascript" src="./jquery.min_44f7138.js"></script>
</head>
<body>
  <button class="js-btn">点击</button>
  <script>
  var totalNum = 1;
  function funClick() {
    var totalNum2 = totalNum;
    return function() {
      $('.js-btn').click(function(){
        alert(totalNum2);
      });
    }
  }

  setTimeout(function(){
    totalNum = 5;
    console.log('setTimeout success 1');
  },5000);

  var param = funClick();
  $(function(){
    param();
  });
</script>
</body>
</html>

上面的这段代码:

希望看到这篇文章能对你有用~

上一篇 下一篇

猜你喜欢

热点阅读