javascript学习笔记(三)——闭包

1.什么是闭包?

  闭包的特点:

  • 函数嵌套函数(内部函数、外部函数)
  • 内部函数可以引用外部函数的参数或者变量
  • 外部函数的参数或变量不会被js的垃圾回收机制收回  

  function aaa() {

    var a = 1;

    function bbb() {

      alert(a);

    }

    return bbb;

  }      

  var c = aaa();

  c();

=>表达式形式

(function() {

  var a = 1;

  return function() {

    alert(a);

  }

})();    

2.闭包有什么好处?

  • 希望一个参数或变量长期驻扎在内存中(不会被外部函数的垃圾回收机制所回收)
  • 避免全局变量的污染
  • 实现私有成员的存在

  

  function aaa() {

    var a = 1;

    a++;

    alert(a);

  }

  aaa();  //2

  aaa();  //2,   每次调用aaa(),a的值都从1开始,如果想每次调用aaa()实现a值得累加,怎么办呢?——闭包

=>function aaa() {

    var a=1;

    function bbb() {

      a++;

      alert(a);

    }

    return bbb;

  }

  var c= aaa();

  c();  //2

  c();  //3

  c(); //4  因为aaa()被执行后,变量a未被垃圾回收机制收回,而是驻扎在内存中,所以每次执行bbb(),a值就会在内存值得基础上加1

3.闭包的用法?

  • 代码的模块会,成员的私有化

  

var c= (function(){

  var a=1;

  function aaa() {

    a++;

    alert(a);

  }

  function bbb(){

    a++;

    alert(a);

  }

  return {

    aa : aaa,

    bb : bbb    

  }    

})();

c.aa();  //2

c.bb(); //3

alert(a); //报错,因为a私有化成员

alert(aaa()); //报错  

4.闭包在IE下容易引发内存泄漏

5.闭包的核心是对参数和变量的不会被js垃圾回收机制回收特性的利用。

时间: 2024-10-13 10:21:42

javascript学习笔记(三)——闭包的相关文章

JavaScript学习笔记(三)——this、原型、javascript面向对象

一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化,当然也可以使用call.apply修改this指向的对象.它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用 1.1.JavaScript中函数与方法的区分 在面向过程的语言中我们习惯把完成某个特定功能的代码块称为“函数”或“过程”,当然过程一般没有返回值.在面向对象语言中我们把对象的功能

Javascript学习笔记:闭包题解(4)

代码: 1 var val1=0; 2 var val2=0; 3 var val3=0; 4 5 for(var i1=1;i1<=3;i1++){ 6 var i2=i1; 7 (function(){ 8 var i3=i2; 9 setTimeout(function(){ 10 val1+=i1; 11 val2+=i2; 12 val3+=i3; 13 },1); 14 })(); 15 } 16 17 setTimeout(function(){ 18 console.log(va

Javascript学习笔记:闭包题解(3)

代码: 1 function assignHandler(){ 2 var element=document.getElementById('someElementId'); 3 4 element.onclick=function(){ 5 alert(element.id); 6 } 7 } 问题:请问以上代码是否存在内存泄漏? 正确答案:存在内存泄漏 解析:由于上段代码中存在闭包,闭包会保存包含该闭包的函数的作用域链,因此element对象会一直存在于内存中,不会被垃圾回收机制回收掉.那么

Javascript学习笔记:闭包题解(1)

代码: 1 function createFunctions(){ 2 var result=[]; 3 for(var i=0;i<10;i++){ 4 result[i]=function(){ 5 return i; 6 }; 7 } 8 return result; 9 } 10 11 var funcs=createFunctions(); 12 console.log(funcs[0]()); 问题:请写出改段代码打印出的结果. 正确答案:10 解析:闭包保存的是包含函数的作用域链,

JavaScript学习笔记三:JavaScript对象

一.前言 对象的基本概念:Javascript提供了多个内建对象,比如String.Data.Array等等.对象指的是带有属性和方法的特殊数据类型 创建对象:创建JavaScript对象主要有两种不同的方法:第一.定义创建对象的实例:第二,使用函数来定义对象,然后创建新的对象 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.

前端乱煮之javascript学习笔记三

1 DOM即为文档对象模型,在html页面加载完成后,浏览器会创建页面的文档对象模型,它看来像是一棵树,有根节点,以及其他的节点. 而通过可编程的对象模型,javascript可以获得创建动态HTML的能力.比如,javascript可以改变HTML所有的元素.可以改变这些元素的属性.可以改变这些元素的样式和能对该页面内的事件作出反应. 2 要想对页面内的元素进行操作,首先就要获得这个元素.通常有三种获得元素的方法,分别是 通过Id来获得元素: 通过标签来获得元素: 通关类名来获得元素: 3 通

JavaScript学习笔记三:基本概念(1)

1. JS中的一切(变量.函数名.操作符等)都区分大小写.--true是boolean值,而True只是标识符. 2. JS语句以分号结尾,但不是必需的,原因: a. 结尾没有分号有时会导致压缩错误. b. 加上分号在某些情况下会为解析器提供方便,增进代码的性能. 3. 不同的ECMAScript版本对关键字和保留字的定义不同,但最好在JS代码中永远都不用任何关键字和保留字,以便与将来的ECMAScript版本兼容. 4. ECMAScript的变量是松散类型的,就是一个变量没有特定的类型限制,

javascript学习笔记(三) string对象中的正则表达式

1. search返回匹配到的位置(-1找不到) var str = 'html js' var pattern = /js/ str.search(pattern)    --------->5 2. Match str.match(pattern) --------['js'] /js/g -----> ["js", "js",,"js"] match vs exec match:非全局的情况下才会返回分组中匹配到的内容,全局匹配

JavaScript学习笔记【3】数组、函数、服务器端JavaScript概述

笔记来自<JavaScript权威指南(第六版)> 包含的内容: 数组 函数 服务器端JavaScript概述 数组 数组是动态的:根据需要它们会增长或缩减,并且在创建数组时无须声明一个固定的大小或在数组大小变化时无须重新分配空间. 数组可能是稀疏的:索引不一定要连续的,它们之间可以有空缺. 通常,数组的实现是经过优化的,用数字索引来访问数组元素一般来说比访问常规的对象属性要快很多. 数组继承自Array.prototype中的属性,它定义了一套丰富的数组操作方法. 如果省略数组直接量中的某个

Java程序猿的JavaScript学习笔记(1——理念)

计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript学习笔记(3--this/call/apply) Java程序猿的JavaScript学习笔记(4--this/闭包/getter/setter) Java程序猿的JavaScript学习笔记(5--prototype) Java程序猿的JavaScript学习笔记(6--面向对象模拟) Java程