`
zhans52
  • 浏览: 35320 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

js 闭包之我的理解

 
阅读更多

一、js作用域:

    由于js没有像 java,c,c++等一样的用{}来定义一个变量的作用域,当然也不是说js就没有作用域的概念。

      我们看下面一段代码:

function f0(){
     var a = 0;
     b = 1;
}
function f1(){
     for(var i=0;i<5;i++){}
     alert(i);
}
 f0();
alert(a); //a is not defined
alert(b); //1
f1();//5

 可见,js中还是有作用域的,也就是全局变量和局部变量,只不过局部变量的访问是function内,而不是{}内。注:我们在函数内定义变量时用 var 则是局部变量,如果不用var 则是定义为全局变量,所以alert(b)时也就有值了。另,如果在函数内部定义的 var k,那么内部将不再使用全局变量k,如果如果在函数内部中在定义之前就使用了k的话是会报错的,同时可以使用window.k调用全局变量k。

、闭包

    由于定义了局部变量a,这样我们起到保护函数内的局部变量的作用但是有时候我们要在函数外部调用或者改变局部变量值时,则就需要用到闭包,请看下面一段代码。

function f0(){
     var a = 0;
     b = 1;
     function f1(){
       alert(++a)
    }
    return f1;
 }
 var c = f0();
c();//1
c();//2
var d=f0();
d();//1

       在我们在执行var c = f0()就产生了一个闭包,也就是在函数外部调用内部变量时(定义的时候是没有的),就会产生闭包 ,这样函数内部定义的变量就不会在随着函数的结束而消失,而是一直存在了缓冲当中(由于js的缓存机制是在当没有调用时回收),所以,闭包要慎用,处理不当会造出浏览器内存溢出。

 

        关于作用域和闭包我们来看一个经典的例子:

var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
		  alert(this.name);//My Object
      return function(){
			 alert(this.name);//The Window
      };
    }
  };
  object.getNameFunc()(); 

 上面的例子中object.getNameFunc()()等价于:

var f2=object.getNameFunc();//弹出My Object 在此getNameFunc为object的局 

                                                              //部函数

f2();//弹出 The Window 在此f2为全局函数

由于在外部调用了内部变量getNameFunc,而getNameFunc的存在依赖于object的存在,所以object将会一直存在。


三、匿名函数:

      所谓匿名函数就是没有名字的函数,一般匿名函数的调用有如下几种方式:

1、(function(){})();

2、(function(){}());

3、在定义触发的时候使用;

1/3是最常用的方式,之前我有一个误区,以为使用了匿名函数就不会产生闭包,这样js的GC就回将垃圾回收回去。GC是否回收回去,取决于函数外部是否调用了函数内部的参数。使用匿名函数的好处就是将局部变量封装,不那么依赖外部变量,当然,缺点也是那么的明显,由于是局部变量,没发引用,在firebug的dom中也看不到,如果使用了大量全局变量,那将是非常痛苦的事,不过在变成过程中还是推荐使用匿名函数。

 

    个人愚见,欢迎指正。

1
0
分享到:
评论

相关推荐

    js闭包个人理解

    js闭包的个人理解

    js闭包的理解以及作用.docx

    JS闭包理解 什么是闭包? 当有一个函数想要访问另一个函数内部的变量,这个是访问不了的。所有我们要用闭包来访问。所以简单的来说,闭包就是连接函数内部和外部的一座桥梁,通过闭包我们能够访问其他函数内部的...

    深入理解javascript原型和闭包

    深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系

    js闭包理解之倒计时

    网上大多只是讲解js闭包的大概意思和小例子,但真实用于项目中又该怎么用呢。这个例子真实的告诉大家在项目中的用法

    javascript深入理解js闭包.docx

    javascript深入理解js闭包.docx

    JavaScript闭包深入理解.pdf

    JavaScript闭包深入理解.pdf

    js 闭包的理解与注意事项

    js 闭包的理解与注意事项

    JS中的闭包理解。。。。。。。。

    js闭包 • 每个函数都有一个包含词法环境的执行上下文,它的词法环境确定了函数内的变量赋值以及对外部环境的引用。看上去函数“记住”了外部环境,但其实上是这个函数有个指向外部环境的引用。这就是“闭包”的...

    理解_JavaScript_闭包

    本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。

    JS 闭包的理解

    NULL 博文链接:https://onestopweb.iteye.com/blog/2360023

    JavaScript闭包

    Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态...本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAScript语言规范来使读者可以更深入的理解闭包。

    JavaScript闭包函数

    闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...

    【JavaScript源代码】js闭包和垃圾回收机制示例详解.docx

    js闭包和垃圾回收机制示例详解  目录 前言 正文  1.闭包  1.1闭包是什么?  1.2闭包的特性 1.3理解闭包  1.4闭包的主要实现形式  1.5闭包的优缺点  1.6闭包的使用  2.垃圾回收机制 总结  前言  正文  ...

    JavaScript闭包的定义和理解,含代码示例

    JavaScript闭包的定义和理解,含代码示例

    深入理解_JavaScript_闭包

    理解 JavaScript 闭包 要成为高级 JavaScript 程序员,就必须理解闭包

    js闭包学习

    javaScript无可争议的是如今前台开发最常用的技术,该文档讲解了javaScript中闭包技术,在jquery中大量的使用了该技术,学好可以更好的理解学习jquery。

    javascript闭包详解中文word版

    本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAscript语言规范来使读者可以更深入的理解闭包。闭包是Closure, 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    前端与移动开发:js对闭包的深入理解.docx

    前端与移动开发:js对闭包的深入理解.docx

    js闭包理解

    • 简介 • 基于对象的属性名解析 o 值的指定 o 值的读取 • 标识符解析、执行环境和作用域链 o 执行环境 o 作用域链与 [[scope]] o 标识符解析 • 闭包

Global site tag (gtag.js) - Google Analytics