浅谈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 相关文章推荐
IE/FireFox具备兼容性的拖动代码
Aug 13 Javascript
JavaScript 学习笔记(十二) dom
Jan 21 Javascript
js实现简单的购物车有图有代码
May 26 Javascript
JavaScript数据类型之基本类型和引用类型的值
Apr 01 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
Jul 20 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
Sep 02 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
Jan 04 Javascript
BootStrap表单验证实例代码
Jan 13 Javascript
JavaScript中使用Async实现异步控制
Aug 15 Javascript
vuejs实现本地数据的筛选分页功能思路详解
Nov 15 Javascript
基于webpack.config.js 参数详解
Mar 20 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
Oct 20 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
浅析php变量修饰符static的使用
2013/06/28 PHP
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
php 可变函数使用小结
2018/06/12 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
2016/02/15 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
node.js实现快速截图
2016/08/27 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
python读取csv文件示例(python操作csv)
2014/03/11 Python
举例介绍Python中的25个隐藏特性
2015/03/30 Python
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
Python实现分段线性插值
2018/12/17 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
django ajax发送post请求的两种方法
2020/01/05 Python
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
大学四年职业生涯规划书范文
2014/01/02 职场文书
大学团日活动新闻稿
2014/09/10 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
运动会宣传语
2015/07/13 职场文书
python tkinter实现定时关机
2021/04/21 Python