浅谈javascript的闭包

 更新时间:2017年01月23日 16:02:39   作者:amsolbfengfeng  
本文介绍了javascript闭包的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧

关于闭包的解释

我们将作用域链描述为一个对象列表,不是绑定的栈。每次调用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;`
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

相关文章

  • webpack打包js的方法

    webpack打包js的方法

    这篇文章主要介绍了webpack打包js的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 基于cssSlidy.js插件实现响应式手机图片轮播效果

    基于cssSlidy.js插件实现响应式手机图片轮播效果

    cssSlidy是一款支持手机移动端的焦点图轮播插件,支持标题设置,滑动动画,间隔时间等。这篇文章主要基于cssSlidy.js插件实现响应式手机图片轮播效果,
    2016-08-08
  • 深入理解JavaScript函数参数(推荐)

    深入理解JavaScript函数参数(推荐)

    这篇文章主要介绍了深入理解JavaScript函数参数(推荐)的相关资料,需要的朋友可以参考下
    2016-07-07
  • javascript 网页进度条简单实例

    javascript 网页进度条简单实例

    这篇文章主要介绍了javascript 网页进度条简单实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • 微信企业号开发之微信考勤Cookies的使用

    微信企业号开发之微信考勤Cookies的使用

    使用微信考勤,每次使用微信企业号开发:微信用户信息和web网页的session的关系这个里边的方法,调用微信的接口,有点慢,微信官方也推荐使用Cookies,但如何使用Cookies,自己却一直没有搞清楚。下面小编帮大家解决难题,需要的朋友可以参考下
    2015-09-09
  • 举例说明javascript冒泡排序

    举例说明javascript冒泡排序

    这篇文章主要为大家介绍了javascript冒泡排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • D3.js入门之D3 DataJoin的使用

    D3.js入门之D3 DataJoin的使用

    DataJoin(数据连接)是D3中很重要的一个概念。D3是基于数据操作DOM的js库,DataJoin使我们能够根据现有 HTML 文档中的数据集注入、修改和删除元素。本文主要和大家详细聊聊DataJoin的使用,感兴趣的可以学习一下
    2022-11-11
  • 前端通过表单将pdf等文件传入后端

    前端通过表单将pdf等文件传入后端

    在一些情境下,用户通过浏览器上传word、excel、pdf等各种类型的文件到系统,上传后可以随时下载,下面这篇文章主要介绍了前端通过表单将pdf等文件传入后端的相关资料,需要的朋友可以参考下
    2024-09-09
  • 比较不错的函数式JavaScript编程指南教程

    比较不错的函数式JavaScript编程指南教程

    你是否知道JavaScript其实也是一个函数式编程语言呢?本指南将教你如何利用JavaScript的函数式特性。
    2008-05-05
  • JavaScript让IE浏览器event对象符合W3C DOM标准

    JavaScript让IE浏览器event对象符合W3C DOM标准

    IE浏览器event对象跟W3C实现的不一样.所以自己封装一个EventUtil类来让IE浏览器的event对象与W3C一样.
    2009-11-11

最新评论