浅谈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 面向对象 对象(Object)
May 13 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
Aug 15 Javascript
js+css实现导航效果实例
Feb 10 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
Nov 25 Javascript
动态加载js、css的简单实现代码
May 26 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
Dec 13 Javascript
基于vue-video-player自定义播放器的方法
Mar 21 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
Jul 08 Javascript
在vue中v-bind使用三目运算符绑定class的实例
Sep 29 Javascript
原生js实现trigger方法示例代码
May 22 Javascript
JavaScript实现点击出现子菜单效果
Feb 08 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
Feb 11 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
PHP导入Excel到MySQL的方法
2011/04/23 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
使用GD库生成带阴影文字的图片
2015/03/27 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
javascript document.referrer 用法
2009/04/30 Javascript
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
30个精美的jQuery幻灯片效果插件和教程
2011/08/23 Javascript
使用firebug进行调试javascript的示例
2013/12/16 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
angularjs 动态从后台获取下拉框的值方法
2018/08/13 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
2018/08/14 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
python调用shell的方法
2013/11/20 Python
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
Python中turtle作图示例
2017/11/15 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
python 如何调用 dubbo 接口
2020/09/24 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
python给list排序的简单方法
2020/12/10 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
英国家电直销:Appliances Direct
2016/09/22 全球购物
运动会广播稿100字
2014/09/14 职场文书
商业门面租房协议书
2014/11/25 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
费城故事观后感
2015/06/10 职场文书
python glom模块的使用简介
2021/04/13 Python
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏
python数字图像处理实现图像的形变与缩放
2022/06/28 Python