浅谈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 相关文章推荐
JS 如果改变span标签的是否隐藏属性
Oct 06 Javascript
onclick与listeners的执行先后问题详细解剖
Jan 07 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
Jun 06 Javascript
JS添加或修改控件的样式(Class)实现方法
Oct 15 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
Jan 08 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
Aug 13 Javascript
vue+element tabs选项卡分页效果
Jun 29 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
Feb 07 Javascript
为react组件库添加typescript类型提示的方法
Jun 15 Javascript
javascript实现贪吃蛇游戏(娱乐版)
Aug 17 Javascript
通过实例解析json与jsonp原理及使用方法
Sep 27 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中通过正则表达式下载内容中的远程图片的函数代码
2012/01/10 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
详解php中反射的应用
2016/03/15 PHP
功能强大的php文件上传类
2016/08/29 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
JavaScript实现禁止后退的方法
2006/12/27 Javascript
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
js鼠标滑过图片震动特效的方法
2015/02/17 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
微信小程序返回上一页传参并刷新过程解析
2019/12/13 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
tensorflow训练中出现nan问题的解决
2018/02/10 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
pandas 时间格式转换的实现
2019/07/06 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
Django模型验证器介绍与源码分析
2020/09/08 Python
使用canvas一步步实现图片打码功能的方法
2019/06/17 HTML / CSS
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
Dyson加拿大官方网站:购买戴森吸尘器,风扇,冷热器及配件
2016/10/26 全球购物
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
高中物理教学反思
2014/02/08 职场文书
班级德育工作实施方案
2014/02/21 职场文书
中文教师求职信
2014/02/22 职场文书
高中军训感言200字
2014/02/23 职场文书
小小商店教学反思
2014/04/27 职场文书
行政申诉状范文
2015/05/20 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
小学校园广播稿
2015/08/18 职场文书
创业计划之特色精品店
2019/08/12 职场文书