浅谈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将数据库中的TEXT类型数据动态赋值到TEXTAREA中
Apr 20 Javascript
List Information About the Binary Files Used by an Application
Jun 11 Javascript
基于Jquery的温度计动画效果
Jun 18 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
Aug 14 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
Jan 19 Javascript
js贪吃蛇游戏实现思路和源码
Apr 14 Javascript
jQuery实现获取h1-h6标题元素值的方法
Mar 06 Javascript
基于node.js制作简单爬虫教程
Jun 29 Javascript
深入浅析Vue不同场景下组件间的数据交流
Aug 15 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
Nov 22 Javascript
详解Vue取消eslint语法限制
Aug 04 Javascript
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
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
把77A收信机改造成收音机
2021/03/02 无线电
php实现读取和写入tab分割的文件
2015/06/01 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
一个符号插入器 中用到的js代码
2007/09/04 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
封装的jquery翻页滚动(示例代码)
2013/11/18 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
AngularJS入门教程之XHR和依赖注入详解
2016/08/18 Javascript
JS实现仿百度文库评分功能
2017/01/12 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
Python函数中定义参数的四种方式
2014/11/30 Python
Django中几种重定向方法
2015/04/28 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
详解Python循环作用域与闭包
2019/03/21 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
python安装scipy的步骤解析
2019/09/28 Python
Tensorflow tf.tile()的用法实例分析
2020/05/22 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
三维科技面试题
2013/07/27 面试题
教师求职信范文分享
2013/12/27 职场文书
户外活动策划方案
2014/03/12 职场文书
js实现自动锁屏功能
2021/06/02 Javascript
Java使用jmeter进行压力测试
2021/07/09 Java/Android
python 多态 协议 鸭子类型详解
2021/11/27 Python