浅谈javascript的闭包


Posted in Javascript onJanuary 23, 2017

关于闭包的解释

我们将作用域链描述为一个对象列表,不是绑定的栈。每次调用javascript函数的时候,都会为之创建一个新的对象来保存变量,把这个对象添那个加至作用域中,当函数返回时,就从作用域链中将这个绑定变量的对象删除,如果不存在嵌套函数,也没有其他引用指向这个绑定的对象,它就会被当垃圾回收掉,

(function () {
 var val = null;
 var callback;
 setTimeout(function () {
  val = 1;
  callback(val)
 },1000)
 window.getVal = function(fn){
  callback = fn;
 }
 })();
 (function(){
 var b =3;
 getVal(function (val) {
  console.log(val);//1
  console.log(b); //3
 getVal(function (val) {
 console.log(val);
 console.log(b); //这里为什么还能打印出b这个变量呢/. 
 });
 //这里匿名函数其实就是一个闭包,你就相当于通过getVal函数把这个闭包传递出去了,你想想看,闭包是不是这样?
})();
//2作用域
 (function(){
 var b =3;
 var ret = function (val) {
  console.log(val);

利用闭包实现的私有属性存取方法

function c     
  return {
  count:function(){
  return n++;
  }
  };
  }
 var a=counter();
 alert(a.count());//返回的0;
 alert(a.count());//返回的是1;

定义的闭包实现的私有属性方法

function addPrivateProperty(o,name,predicate){
var value;
o["get"+name]=function(){return value);}//get 存取器的属性只读,将其直接简单的返回
//setter方法检验值是否合法,若不合法就抛出异常
o["set"+name]=function(v){{
if(predicate&&!predicate(v)) throw Error("");
else {
value=v;
}
}

典型错误

function constfuncs(){
var funcs=[];
for(var i=0;i<10;i++){
funcs[i]=function(){return i;};
}
return funcs;
}
var func=constfuncs();
console.log(func[5]());
;//返回值? 10

由于此函数的闭包都是在同一个函数调用中定义的,因此可以共享变量i;

关联到闭包的作用域链都是活动的,嵌套的函数不会将作用域内的私有成员复制一份,也不会对所绑定的变量生成静态快照;在闭包时后this是javascript的一个关键字而不是变量

解决办法

function Bb(){
this.run=function(){}//this就是Bb这个对象;
}
而function run(){
function gg(){alert(this就是window)}//this就是window;`
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
Jquery 点击按钮自动高亮实现原理及代码
Apr 25 Javascript
JS 使用for循环遍历子节点查找元素
Sep 06 Javascript
JavaScript编程的单例设计模讲解
Nov 10 Javascript
AngularJS入门教程之AngularJS模型
Apr 18 Javascript
JavaScript设计模式开发中组合模式的使用教程
May 18 Javascript
自定义vue全局组件use使用、vuex的使用详解
Jun 14 Javascript
微信小程序实现轮播图效果
Sep 07 Javascript
原生JS实现 MUI导航栏透明渐变效果
Nov 07 Javascript
微信小程序progress组件使用详解
Jan 31 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
Apr 27 jQuery
JS复杂判断的更优雅写法代码详解
Nov 07 Javascript
Echarts.js无法引入问题解决方案
Oct 30 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
Jan 23 #Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
Jan 23 #Javascript
Node.js Express 框架 POST方法详解
Jan 23 #Javascript
js 颜色选择插件
Jan 23 #Javascript
JavaScript常用正则函数用法示例
Jan 23 #Javascript
详解微信小程序 wx.uploadFile 的编码坑
Jan 23 #Javascript
微信小程序侧边栏滑动特效(左右滑动)
Jan 23 #Javascript
You might like
亚洲咖啡有什么?亚洲咖啡产地介绍 亚洲咖啡有什么特点?
2021/03/05 新手入门
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
PHP 批量更新网页内容实现代码
2010/01/05 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
php实现微信发红包功能
2018/07/13 PHP
从JavaScript的函数重名看其初始化方式
2007/03/08 Javascript
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
js 实现 input type=&quot;file&quot; 文件上传示例代码
2013/08/07 Javascript
jQuery实现渐变下拉菜单的简单方法
2015/03/11 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
JavaScript中Object.prototype.toString方法的原理
2016/02/24 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
bootstrap fileinput插件实现预览上传照片功能
2018/01/23 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
[01:03:47]VP vs NewBee Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
python中的yield使用方法
2014/02/11 Python
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
Python装饰器语法糖
2019/01/02 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
Python求离散序列导数的示例
2019/07/10 Python
Python OpenCV实现测量图片物体宽度
2020/05/27 Python
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
宾馆总经理岗位职责
2014/02/14 职场文书
篮球社团活动总结
2014/06/27 职场文书
2014年学校后勤工作总结
2014/12/06 职场文书
参观邀请函范文
2015/02/02 职场文书
普通员工辞职信范文
2015/05/12 职场文书
致青春观后感
2015/06/09 职场文书
Golang 并发编程 SingleFlight模式
2022/04/26 Golang