再谈函数
/*
形成闭包条件
函数有返回值,而且返回值必须是复杂类型,而且要赋值给外面的变量。
*/
function test(){
var name = "www"
console.log(name) //打印结束后自动销毁
var obj={
a:1,
b:2
}
return obj
}
var obj1=test()
var obj2=test()
// obj1===obj2 为flase 创建了2个对象.只是内容相同.
// obj将被保留下来. 当不需要这个复杂类型时
//obj1=null 就删除存在堆中的对象了.
闭包
<script>
/* 闭包
函数内部返回一个函数,被外界所引用
这个内部函数就不会被销毁回收。
内部函数所用到的外部函数的变量也不会被回收。
*/
/*
优点:让临时变量永驻内存
缺点: 内存泄漏
*/
function fun(){
var name = "ww" //被内部函数用到则不会被回收
var age = 18 //这个将销毁回收
return function(){
return name+"111111111111"
}
}
var eee = fun()
console.log(eee())
</script>
1、通过闭包实现记住列表的索引( ES6用let定义更方便。)
for(var i=0;i<oli.length;i++){
oli[i].onclick = (function(index){
return function(){
console.log(111,index)
}
})(i) //匿名自执行函数
}
2、函数防抖
<input type="text" name="" id="mysearch">
<ul id="list"></ul>
function test(obj) {
console.log(obj.g)
list.innerHTML = obj.g.map(item =>
`<li>${item.q}</li>`
).join("")
}
mysearch.oninput = (function () { //绑定事件
var timer = null //定义一个变量
return function (evt) {
console.log("111111111")
if (timer) { //如果timer有值的时候,就为true
clearTimeout(timer) //执行清除定时器
}
timer = setTimeout(function () { //爆炸定时器
if (!evt.target.value) { //如果不为空字符串
list.innerHTML = ""
return
}
var oscript = document.createElement("script") //新建一个节点
oscript.src =
`https://www.baidu.com/sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web&sugsid=36542,36464,36673,36454,31660,36692,36166,36695,36697,36570,36074,36655,36345,26350,36469,36314&wd=${evt.target.value}&req=2&csor=1&cb=test&_=1656294200527`
document.body.appendChild(oscript) //插入到body下
oscript.onload = function () { //清除oscript
// 不然每点击一下就会在html中新建一个.
oscript.remove()
}
}, 500)
}
})() //匿名自执行函数
</script>