什么是闭包:一个函数嵌套另一个函数,里层的函数调用外层的函数的变量 这种现象称作闭包
<script>
//闭包:一个函数嵌套另一个函数,里层的函数调用外层的函数的变量 称作闭包
function fn() {
let n = 10
function f() {
console.log(n)
}
f()
}
fn()
</script>
箭头函数:
- 函数表达式:将一个函数赋值给一个变量
<script> const fn = function(形参1,形参2){} </script>
- 基本语法:将函数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>