本文主要介绍js闭包的9种使用场景,帮助你更好的理解和学习JavaScript闭包的使用。感兴趣的朋友可以了解一下。
1.返回值(最常用)
//1.最常用的返回值
函数fn(){
var name=' hello
返回函数(){
返回名称;
}
}
var fnc=fn();
console . log(fnc())//你好
很容易理解名字是以闭包的形式返回的。
2.函数赋值
var fn2
函数fn(){
var name=' hello
//将功能分配给fn2
fn2=function(){
返回名称;
}
}
Fn()//首先执行赋值,
Console.log(fn2())//执行输出fn2
在闭包中设置fn2函数的值,以闭包的形式记忆name属性,执行会输出hello。
3.函数参数
函数fn(){
var name=' hello
返回函数回调(){
返回名称;
}
}
var 1=fn()//执行函数将返回值(回调函数)赋给fn1,
功能fn2(f){
//将函数作为参数传入
console . log(f());//执行函数并输出。
}
2(FN1)//执行输出fn2
用闭包返回一个函数,把这个函数作为另一个函数的参数,在另一个函数中执行这个函数,最后输出hello。
4.IIFE(自执行函数)
(函数(){
var name=' hello
var fn1=function(){
返回名称;
}
//在自执行函数中直接调用fn2,将fn1作为参数传递。
fn2(fn1);
})()
功能fn2(f){
//将函数作为参数传入
console . log(f());//执行函数并输出。
}
在自执行函数中直接传递封装的函数fn1到fn2,并将其作为参数调用,同样得到结果hello。
5.循环赋值
//每秒执行一次,分别输出1-10。
for(var I=1;i=10i ){
(函数(j){
//j来接收
setTimeout(function(){
console . log(j);
},j * 1000);
})(i)//i作为参数传入。
}
如果不使用闭包,会有不同的情况。你可以阅读我自己关于闭包的文章。
6.getter和setter
函数fn(){
var name='你好'
setName=function(n){
name=n;
}
getName=function(){
返回名称;
}
//返回setName,getName作为对象的属性
返回{
集合名称:集合名称,
getName:getName
}
}
var fn1=fn();//返回对象,属性setName和getName是两个函数。
console . log(fn1 . getname());//getter
fn1 . set name(' world ');//setter修改闭包内的名称。
console . log(fn1 . getname());//getter
第一次输出hello,用setter,然后输出世界。这可以封装成一个公共方法,防止不想公开的属性和函数对外公开。
7.迭代器(执行一次函数往下取一个值)
var arr=['aa ',' bb ',' cc '];
函数incr(arr){
var I=0;
返回函数(){
//这个函数每次执行都返回数组arr中I下标对应的元素
Return arr[i] || '数组值已被遍历';
}
}
var next=incr(arr);
console . log(next());//aa
console . log(next());//bb
console . log(next());//抄送
console . log(next());//数组值已被遍历
8.首次区分(相同的参数,函数不会重复执行)
var fn=(function(){
var arr=[];//用于缓存的数组
返回函数(val){
If(arr.indexOf(val)==-1){//如果缓存中什么都没有,就意味着需要执行。
arr . push(val);//将参数推入缓存数组
Console.log('函数已执行',arr);
//在这里写下你要执行的函数
}否则{
Console.log('此功能不需要执行');
}
Console.log('函数调用后打印出来,这样可以查看缓存的数组:',arr);
}
})();
fn(10);
fn(10);
fn(1000);
fn(200);
fn(1000);
执行结果如下:
可以清楚的看到,第一次执行会被保存,第二次执行会直接被执行。
9.缓存
//比如sum运算,如果没有缓存,每次调用都要重复,用缓存里已经做好的东西去找,找到了就直接返回,不用重新计算。
var fn=(function(){
var cache={ };//缓存对象
Var calc=function(arr){//计算函数
var sum=0;
//总和
for(var I=0;iarr .长度;i ){
sum=arr[I];
}
返回总和;
}
返回函数(){
var args=array . prototype . slice . call(arguments,0);//参数被转换成数组
var key=args.join(',');//用逗号将参数连接成字符串
var result,tSum=cache[key];
If(tSum){//如果缓存有
Console.log ('get from the cache:',cache)//打印以便于查看
结果=tSum
}否则{
//重新计算,存入缓存,同时赋给result。
结果=cache[key]=calc(args);
Console.log('存储在缓存中:',缓存)//打印以便于查看
}
返回结果;
}
})();
fn(1,2,3,4,5);
fn(1,2,3,4,5);
fn(1,2,3,4,5,6);
fn(1,2,3,4,5,8);
fn(1,2,3,4,5,6);
输出结果:
以上是js闭包9个使用场景的细节。关于js闭包使用场景的更多信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。