浅谈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 相关文章推荐
javascript编程起步(第七课)
Feb 27 Javascript
Javascript 网页水印(非图片水印)实现代码
Mar 01 Javascript
JS 跳转页面延迟2种方法
Mar 29 Javascript
详解Vue.use自定义自己的全局组件
Jun 14 Javascript
vue父组件向子组件动态传值的两种方法
Nov 11 Javascript
Vue.js devtool插件安装后无法使用的解决办法
Nov 27 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
Sep 21 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
Nov 13 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
May 26 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
Aug 20 Javascript
JavaScript随机数的组合问题案例分析
May 16 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
Jan 28 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简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
php 什么是PEAR?(第二篇)
2009/03/19 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
php面向对象值单例模式
2016/05/03 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
2017/06/07 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
js给网页加上背景音乐及选择音效的方法
2015/03/03 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
javascript中的面向对象
2017/03/30 Javascript
webpack构建换肤功能的思路详解
2017/11/27 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
详解使用webpack+electron+reactJs开发windows桌面应用
2019/02/01 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
python 换位密码算法的实例详解
2017/07/19 Python
Python爬虫包BeautifulSoup简介与安装(一)
2018/06/17 Python
示例详解Python3 or Python2 两者之间的差异
2018/08/23 Python
python实现定时发送qq消息
2019/01/18 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
python生成大写32位uuid代码
2020/03/03 Python
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
C语言面试题
2013/05/19 面试题
优秀干部获奖感言
2014/01/31 职场文书
担保书怎么写
2014/04/01 职场文书
2015年语文教师工作总结
2015/05/25 职场文书