闭包 箭头函数 数组常用方法

什么是闭包:一个函数嵌套另一个函数,里层的函数调用外层的函数的变量 这种现象称作闭包

 <script>
    //闭包:一个函数嵌套另一个函数,里层的函数调用外层的函数的变量 称作闭包
    function fn() {
      let n = 10
      function f() {
        console.log(n)
      }
      f()
    }
    fn()
  </script>

箭头函数:

  1. 函数表达式:将一个函数赋值给一个变量
    <script>
    
    const fn = function(形参1,形参2){}
    
    </script>
    

  2. 基本语法:将函数function省略 在小括号和或括号之间添加 =>
    
    <script>
    
    const fn = function(){}
    
    const fn = () => {}
     
    </script>
    
       

 3.如果函数里面只有一个形参 则可以省略小括号


<script>

const fn = function(pat){}  注释:parameter参数的意思

const fn = pat => {}
    
</script>

4.如果函数里面体里面只有一行代码可以省略 {} 

<script>

const fn = function(pat){  
    console.log(1)
} 

const fn = pat => console.log(1)

</script>

    

5.函数体里面只有一行代码 return关键字可以省略 {} 可以省略

<script>

const fn= function(pat){  
    return pat
} 

const fn = pat => pat
 
</script>

数组常用方法 :

  • 数组.map(function(数组元素,数组索引,) {}) 

  • map方法主要是可以用来遍历数组对象 把数组对象属性写入到html标签里面 并返回一个新数组 
  • <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>商品渲染</title>
      <style>
        * {
          margin: 0;
          padding: 0;
          box-sizing: border-box;
        }
    
        .list {
          width: 990px;
          margin: 0 auto;
          display: flex;
          flex-wrap: wrap;
        }
    
        .item {
          width: 240px;
          margin-left: 10px;
          padding: 20px 30px;
          transition: all .5s;
          margin-bottom: 20px;
        }
    
        .item:nth-child(4n) {
          margin-left: 0;
        }
    
        .item:hover {
          box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
          transform: translate3d(0, -4px, 0);
          cursor: pointer;
        }
    
        .item img {
          width: 100%;
        }
    
        .item .name {
          font-size: 18px;
          margin-bottom: 10px;
          color: #666;
        }
    
        .item .price {
          font-size: 22px;
          color: firebrick;
        }
    
        .item .price::before {
          content: "¥";
          font-size: 14px;
        }
    
       
      </style>
    </head>
    
    <body>
      <div class="list">
        <!-- <div class="item">
          <img src="" alt="">
          <p class="name"></p>
          <p class="price"></p>
        </div> -->
      </div>
      <script>
        // 2. 初始化数据
        const goodsList = [
          {
            id: '4001172',
            name: '称心如意手摇咖啡磨豆机咖啡豆研磨机',
            price: '289.00',
            picture: 'https://yanxuan-item.nosdn.127.net/84a59ff9c58a77032564e61f716846d6.jpg',
          },
          {
            id: '4001594',
            name: '日式黑陶功夫茶组双侧把茶具礼盒装',
            price: '288.00',
            picture: 'https://yanxuan-item.nosdn.127.net/3346b7b92f9563c7a7e24c7ead883f18.jpg',
          }
        ]
        //1定义一个函数渲染数据
        function render(arr) {
          //1.1通过map方法对数组进行加工
          // const newArr = arr.map(function (item) {
          const newArr = arr.map(item => {
            //1.2通过对象解构获取对象里面的数据
            const { name, price, picture } = item
            // console.log(name);
            return `
           <div class="item">
              <img src="${picture}" alt="">
                <p class="name">${name}</p>
                <p class="price">${price}</p>
            </div>
           `
          })
          //1.3通过数组.join方法把新数组newArr变成一个html可以解析的字符串写入到html标签里面
          document.querySelector('.list').innerHTML = newArr.join('')
    
        }
        render(goodsList)
    
     
      </script>
    </body>
    
    </html>

  • 数组.join(function(pst) {} )   主要结合map方法使用

  • 指定一个字符串来分隔数组的每对相邻元素。如有必要,分隔符将转换为字符串。如果省略,数组元素用逗号 (“,”) 分隔。如果 为空字符串,则连接所有元素时,它们之间没有任何字符
  • 数组.forEach(function (数组元素, 数组索引, 数组本身) { })

  •  <script>
    
    const arr = ['a', 'b', 'c', 'd']
    
         // 数组.forEach(function (数组元素, 数组索引, 数组本身) { })
    
         arr.forEach(function (item) {
    
           console.log(item);
    
         })
    
         arr.forEach(item => console.log(item))
    
    </script> 
    

  • 数组.filter(function(数组元素,数组索引,){})

  • 主要用来筛选数组元素
 <script>
    //从数组中筛选出大于20的元素

    const arr = [10, 20, 30, 40, 50]

    // const newArr = arr.filter(function (item) {

    const newArr = arr.filter(item => {

      if (item > 20) {

        return item

      }

    })

    console.log(newArr);
  </script>

综合案例:通过商品价格筛选商品

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>商品渲染</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    .list {
      width: 990px;
      margin: 0 auto;
      display: flex;
      flex-wrap: wrap;
    }

    .item {
      width: 240px;
      margin-left: 10px;
      padding: 20px 30px;
      transition: all .5s;
      margin-bottom: 20px;
    }

    .item:nth-child(4n) {
      margin-left: 0;
    }

    .item:hover {
      box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
      transform: translate3d(0, -4px, 0);
      cursor: pointer;
    }

    .item img {
      width: 100%;
    }

    .item .name {
      font-size: 18px;
      margin-bottom: 10px;
      color: #666;
    }

    .item .price {
      font-size: 22px;
      color: firebrick;
    }

    .item .price::before {
      content: "¥";
      font-size: 14px;
    }

    .filter {
      display: flex;
      width: 990px;
      margin: 0 auto;
      padding: 50px 30px;
    }

    .filter a {
      padding: 10px 20px;
      background: #f5f5f5;
      color: #666;
      text-decoration: none;
      margin-right: 20px;
    }

    .filter a:active,
    .filter a:focus {
      background: #05943c;
      color: #fff;
    }
  </style>
</head>

<body>
  <div class="filter">
    <a data-index="1" href="javascript:;">0-100元</a>
    <a data-index="2" href="javascript:;">100-300元</a>
    <a data-index="3" href="javascript:;">300元以上</a>
    <a href="javascript:;">全部区间</a>
  </div>
  <div class="list">
    <!-- <div class="item">
      <img src="" alt="">
      <p class="name"></p>
      <p class="price"></p>
    </div> -->
  </div>
  <script>
    // 2. 初始化数据
    const goodsList = [
      {
        id: '4001172',
        name: '称心如意手摇咖啡磨豆机咖啡豆研磨机',
        price: '289.00',
        picture: 'https://yanxuan-item.nosdn.127.net/84a59ff9c58a77032564e61f716846d6.jpg',
      },
      {
        id: '4001594',
        name: '日式黑陶功夫茶组双侧把茶具礼盒装',
        price: '288.00',
        picture: 'https://yanxuan-item.nosdn.127.net/3346b7b92f9563c7a7e24c7ead883f18.jpg',
      },
      {
        id: '4001009',
        name: '竹制干泡茶盘正方形沥水茶台品茶盘',
        price: '109.00',
        picture: 'https://yanxuan-item.nosdn.127.net/2d942d6bc94f1e230763e1a5a3b379e1.png',
      },
      {
        id: '4001874',
        name: '古法温酒汝瓷酒具套装白酒杯莲花温酒器',
        price: '488.00',
        picture: 'https://yanxuan-item.nosdn.127.net/44e51622800e4fceb6bee8e616da85fd.png',
      },
      {
        id: '4001649',
        name: '大师监制龙泉青瓷茶叶罐',
        price: '139.00',
        picture: 'https://yanxuan-item.nosdn.127.net/4356c9fc150753775fe56b465314f1eb.png',
      },
      {
        id: '3997185',
        name: '与众不同的口感汝瓷白酒杯套组1壶4杯',
        price: '108.00',
        picture: 'https://yanxuan-item.nosdn.127.net/8e21c794dfd3a4e8573273ddae50bce2.jpg',
      },
      {
        id: '3997403',
        name: '手工吹制更厚实白酒杯壶套装6壶6杯',
        price: '99.00',
        picture: 'https://yanxuan-item.nosdn.127.net/af2371a65f60bce152a61fc22745ff3f.jpg',
      },
      {
        id: '3998274',
        name: '德国百年工艺高端水晶玻璃红酒杯2支装',
        price: '139.00',
        picture: 'https://yanxuan-item.nosdn.127.net/8896b897b3ec6639bbd1134d66b9715c.jpg',
      },
    ]
    //1定义一个函数渲染数据
    function render(arr) {
      //1.1通过map方法对数组进行加工
      // const newArr = arr.map(function (item) {
      const newArr = arr.map(item => {
        //1.2通过对象解构获取对象里面的数据
        const { name, price, picture } = item
        // console.log(name);
        return `
       <div class="item">
          <img src="${picture}" alt="">
            <p class="name">${name}</p>
            <p class="price">${price}</p>
        </div>
       `
      })
      //1.3通过数组.join方法把新数组newArr变成一个html可以解析的字符串写入到html标签里面
      document.querySelector('.list').innerHTML = newArr.join('')

    }
    render(goodsList)

    // 2点击价格筛选商品

    //2.1 获取所有的a元素
    const as = document.querySelectorAll('.filter a')
    // 2.2 通过数组.forEach方法遍历数组 给每一个对象添加点击事件
    as.forEach(item => {
      // 给每一个对象添加点击事件
      item.addEventListener('click', function () {
        // console.log(1);
        //2.3获取自定义属性值来判断点击的是哪一个价格区间
        const i = this.dataset.index
        // console.log(this);
        // console.log(i);
        //2.4通过自定义属性值判断点击的是哪一个区间
        let arr = []
        if (i === '1') {
          // 2.5通过数组.filter对价格进行筛选
          //  <100
          // goodsList.filter(function (item) {
          //   if (item.price > 0 && item.price <= 100) { return item }
          arr = goodsList.filter(item => item.price > 0 && item.price <= 100)
        } else if (i === '2') {
          //100-300
          arr = goodsList.filter(item => item.price > 100 && item.price <= 300)

        } else if (i === '3') {
          //  >300
          arr = goodsList.filter(item => item.price > 300)

        } else {
          //所有
          arr = goodsList
        }
        render(arr)
      })
    })
  </script>
</body>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值