闭包的概念

内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止。可理解为,闭包就是能够读取其他函数内部变量的函数。

表现形式是:定义在函数内部的函数。

  function f1(){
    var n=999;
    function f2(){
      alert(n); //
    }
  }

如上,f2函数可以访问到f1的局部变量n

反之则不行。我们无法获得内置函数的局部变量。

function add(num1){
return function(num2){
return num1+num2;
};
}
var num2 = add(4);
// 9
alert(num2(5));

闭包的作用

1. 使用匿名函数来隐藏全局作用域变量

这是一个自执行函数,对于msg变量,执行完立即释放。不污染全局对象。

(function(){
var msg = "Bye";
window.onload=function(){
alert(msg);
} })();

闭包的问题:闭包可以引用父函数中的变量,但提供的值并非该变量创建时的值,是在父函数范围内的最终值。最常见的问题是在for循环中

2. 绑定事件的例子

  1.通过数组给对象绑定多个事件
  2.obj.方法名 等价于 obj"方法名"]数组写法

(function(){
var obj = document.getElementById("main");
var items = ["click","mouseover"];
for(var i=0;i<items.length;i++){
(function(){
var item = items[i];
obj["on"+ item] = function(){
alert("you have "+item);
}
})()
}
})();

3. 结果缓存

有一个需求,每次执行变量值加1。在不使用全局变量的情况下我们可以使用闭包

function f1(){
var n = 1;
plusOne = function(){
n+=1;
alert(n);
}
return plusOne;
} f1();
plusOne(); // 2
plusOne(); // 3
// n is not defined
alert(n);

4. 封装, 模拟对象的私有方法

var person = function(){
//变量作用域为函数内部,外部无法访问
var name = "default"; return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
}(); print(person.name);//直接访问,结果为undefined
print(person.getName());
person.setName("abruzzi");
print(person.getName());

再来个例子

var event = {};

(function(){
var add = function(){
return this.age+1;
}
event.add = add;
})();

event.age = 1;
var age = event.add();
alert(age)
// 出错
add()

上例中。add是局部方法,却可以通过全局对象event调用。防止暴露了内部方法。这样可以提高安全性。

参考:

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

http://www.2cto.com/kf/201410/342609.html

Javascript闭包例子的更多相关文章

  1. javascript 闭包(转)

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  2. JavaScript 闭包整合

    初遇闭包感觉很困惑,上网查看了些许介绍,有很多没看懂,就想先对能懂的东西整整 首先觉得要了解闭包,要先对一.JavaScript的变量作用域和作用域链有基本了解 1.变量的作用域分为:全局变量和局部变 ...

  3. 对于 Javascript 闭包理解

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  4. javascript闭包的理解

    闭包是Javascript的一个难点,但也是一个很重要的知识点. 1.首先我们要知道变量作用域链 变量的作用域分两种:全局变量和局部变量.没有定义到任何函数中的变量为全局变量,在函数中定义的变量为局部 ...

  5. 深入理解javascript闭包(一)

    原文转自脚本之家(http://www.jb51.net/article/24101.htm) 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...

  6. JavaScript“闭包”精解

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. 详细了解 Javascript语言的特殊之处,就在于函数内部可以直接读 ...

  7. javascript闭包和this对象

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...

  8. javascript 闭包学习

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...

  9. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

随机推荐

  1. poj1322 Chocolate 【 概率DP 】

    题目链接:poj1322 Chocolate [概率DP ] 题意:袋中有C种颜色巧克力,每次从其中拿出一块放桌上,如果桌上有两块相同颜色巧克力则吃掉,问取出N块巧克力后,求桌上正好剩下M块巧克力的概 ...

  2. c3p0整合mysql报错问题

    启动报错: [com.mchange.v2.c3p0.DriverManagerDataSource] - Could not load driverClass com.mysql.cj.jdbc.D ...

  3. BZOJ2141:排队(分块,树状数组)

    Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们 ...

  4. 压缩Windows系统磁盘

    compact /compactOS:always #压缩所有 OS 二进制文件并将系统状态设置为"压缩" compact /compactOS:never #减压缩所有 OS 二 ...

  5. 十一、IntelliJ IDEA 中的版本控制介绍(上)

    咱们已经了解了很多关于 IntelliJ IDEA 的使用方法,至少可以独立的运用 IntelliJ IDEA 进行项目开发啦!但是一个人进行项目开发更趋向于理想化,更多的则是团队协同开发.这时,咱们 ...

  6. AngularJS简介-起步阶段

    AngularJS 是一个为动态WEB应用设计的结构框架,提供给大家一种新的开发应用方式,这种方式可以让你扩展HTML的语法,以弥补在构建动态WEB应用时静态文本的不足,从而在web应用程序中使用HT ...

  7. js的匿名函数与自定义函数

    //匿名方法,会执行,自己调用自己 (function () { console.log(window.innerHeight); })(); (function () { console.log(w ...

  8. type和 #define

    1.#define INT8U unsigned char   :  用INT8U代替unsigned char 2.typedef typedef int size; 此声明定义了一个int的同义字 ...

  9. Jquery与js简单对比

    //Javascript window.onload=function () { var oBtn=document.getElementById('btn1'); oBtn.onclick=func ...

  10. 转:30分钟学会如何使用Shiro

    引自:http://www.cnblogs.com/learnhow/p/5694876.html 本篇内容大多总结自张开涛的<跟我学Shiro>原文地址:http://jinniansh ...