博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
闭包的7种形式
阅读量:5826 次
发布时间:2019-06-18

本文共 1898 字,大约阅读时间需要 6 分钟。

返回值

  最常用的一种形式是函数作为返回值被返回

var F = function(){    var b = 'local';    var N = function(){        return b;    }    return N;}console.log(F()());

 

函数赋值

  一种变形的形式是将内部函数赋值给一个外部变量

var inner;var F = function(){    var b = 'local';    var N = function(){        return b;    };    inner = N;};F();console.log(inner());

 

函数参数

  闭包可以通过函数参数传递函数的形式来实现

var Inner = function(fn){    console.log(fn());}var F = function(){    var b = 'local';    var N = function(){        return b;    }    Inner(N);}F();

 

IIFE

  由前面的示例代码可知,函数F()都是在声明后立即被调用,因此可以使用IIFE来替代。但是,要注意的是,这里的Inner()只能使用函数声明语句的形式,而不能使用函数表达式。详细原因移步至此

function Inner(fn){    console.log(fn());}(function(){    var b = 'local';    var N = function(){        return b;    }    Inner(N);})();

 

循环赋值

  在闭包问题上,最常见的一个错误就是循环赋值的错误。关于其错误原因的详细解释移步至此

function foo(){    var arr = [];    for(var i = 0; i < 2; i++){        arr[i] = function(){            return i;        }    }    return arr;}var bar = foo();console.log(bar[0]());//2

  正确的写法如下

function foo(){    var arr = [];    for(var i = 0; i < 2; i++){        arr[i] = (function fn(j){            return function test(){                return j;            }        })(i);    }    return arr;}var bar = foo();console.log(bar[0]());//0

 

g(s)etter

  我们通过提供getter()和setter()函数来将要操作的变量保存在函数内部,防止其暴露在外部

var getValue,setValue;(function(){    var secret = 0;    getValue = function(){        return secret;    }    setValue = function(v){        if(typeof v === 'number'){            secret = v;        }    }})();console.log(getValue());//0setValue(1);console.log(getValue());//1

 

迭代器

  我们经常使用闭包来实现一个累加器

var add = (function(){    var counter = 0;    return function(){        return ++counter;     }})();console.log(add())//1console.log(add())//2

  类似地,使用闭包可以很方便的实现一个迭代器

 

console.log(next());//'a'console.log(next());//'b'console.log(next());//'c'

本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1924094,如需转载请自行联系原作者

你可能感兴趣的文章
cisco IOS image summary
查看>>
Liunx虚拟机上网
查看>>
写脚本遇到的问题(一)
查看>>
我的友情链接
查看>>
ALI OSS RequestTimeTooSkewed
查看>>
cengos6.3安装Intel Advanced-N 6205无线驱动
查看>>
redhat 6及centos5.6加载光驱并设置更新源yum
查看>>
P1162 填涂颜色
查看>>
[数据同步] Linux与Windows进行数据同步
查看>>
线性筛欧拉函数
查看>>
Python学习第一周学习总结
查看>>
计算机内存管理相关
查看>>
我的友情链接
查看>>
linux重启之后出错,和解决方法
查看>>
路由器G口S口对比实验
查看>>
我的友情链接
查看>>
3.1-Mysql的root密码重置
查看>>
页面切换代码
查看>>
expect dialogue
查看>>
zabbix使用自带模板监控MySQL
查看>>