高阶函数
高阶函数是对其它函数进行操作的函数,它接收函数作为参数或者将函数作为返回值输出
/函数可以作为参数传递
function fn(a,b,callback) {
console.log(a+b);
callback&&callback();
}
fn(1,2,funnction(){
console.log('楠楠nb‘);
});
此时的fn就是一个高阶函数。函数也是一种数据类型,同样可以作为参数,传递给另外一个函数使用,例如回调函数。
闭包
变量的作用域
- 函数内部可以使用全局变量
- 函数外部不可以使用局部变量
- 当函数执行完毕之后,本作用域里的局部变量会被销毁
闭包
闭包是指有权访问另一个函数的作用域中变量的函数。就是说,一个作业域可以访问另外一个函数内部的局部变量。
实质是延申了变量的作用范围
closure//一个作用域可以访问另外一个函数的局部变量
funnction fn(){
var sum = 10;
function fun() {
console.log(num);//10
}
fun();
}
fn();
//fn外面的作用域可以访问fn内部的局部变量
funnction fn(){
var sum = 10;
function fun() {
console.log(num);//10
}
return fun;
}
var f = fn();
f();
fn一调用就会执行fn这个函数,相当于执行
var f =function fun() {
console.log(num);//10
}
看一个案例点击li输出序号值
<class id="nav">
<li>香蕉牛奶</li>
<li>番茄炒蛋</li>
<li>卡布奇诺</li>
//1.利用动态添加属性的方法
var lis=document.querrySelector('.nav').querrSelectorAll('li');
for (var i=0; i<lis.length;i++){
lis[i].index=i;
lis[i].onclick=functiion(){
console.log(this.index);
}
}
//2.利用闭包的方式来获得li的索引号
for(var i=0;i<lis.length;i++){
//利用for循环创建三个立即执行的函数
//立即执行函数也成为一个小闭包因为立即执行函数里面的任何一个函数都可以使用i这个变量
(function(i){
lis[i].onclick=function(){
console.log(i);
}
})(i);
}
但是这个的闭包效率低,并且i占内存。会造成内存泄漏。
(什么是内存泄露:
内存泄漏就是申请了空间却没有成功释放,或者是申请了空间,却丢失了指向该空间的指针,造成内存无法操控,
危害:
内存泄漏会导致系统变慢,卡顿,甚至卡死。
长期运行的程序出现内存泄漏,影响,如操作系统,后台服务等,影响很大。)
//三秒后打印所有li元素的内容
var lis = document.querrySelector('.nav').querySelectorAll('li');
for(var i=0; i<lis.length;i++){
function(i){
setTimeout(function){
console.log(lis[i].innerHTML);
},3000)
})(i);
}
闭包是定时器里面的这个函数,用到了另外一个立即执行函数里面的i变量,也是一个函数使用另外一个函数的变量。即在立即执行函数里面的函数都可以使用立即执行函数的i变量