JavaScript的闭包详解
(1)定义:
函数内部返回一个函数,返回出来的这个函数叫做被我们称之为闭包(个人理解的最简单的表现形式,)
(2)为什么要使用闭包呢? 局部变量在函数执行完之后就会被GC回收,有时候我们想在外部访问内部的变量,这个时候就用到了闭包 (3)闭包有两个作用: a.访问函数内部的变量(函数作为返回值)
b.保存作用域(函数作为参数传递)
//1.访问函数内部的变量(函数作为返回值)
function test(){
var age = 18;
return function(){
console.log(age);
}
} var myTest = test();
console.log(myTest);//为匿名函数,function(){console.log(age)}
myTest();// //另一个例子
function fn() {
var max = 10;
return function bar(x) {
if (x > max) {
console.log(x);
}
}
}
var f1 = fn();
console.log(f1);//function bar(x){if(x>max){console.log(x);}}
f1(15);//结果为15 //保存作用域(函数作为参数传递) //保存作用域
function test(){
var a = 1;//局部变量
hehe = function(){//全局变量
a++;
};
return function(){
console.log(a);
}
} var haha = test();//此时haha为test()执行完之后的返回值,匿名函数function(){consolloe.log(a)}
haha();//打印1
hehe();//hehe函数为全局变量,可以在外边执行,此处a++
haha();//打印2
hehe();//同上 //注意:haha为全局变量,不会被GC回收,所以test函数的返回值,一直存在,test的作用域一直存在,不会被GC回收 //注意:自由变量跨域取值时,要去创建这个函数的作用域取值,而不是“父作用域”;
//
var max = 10;
var fn = function(x){
if(x>max){
console.log(max);//
console.log(x);//
}
}; (function(f){
var max = 100;
f(15);
})(fn);
(4)闭包的使用
假设页面上有5个div节点,我们通过循环来给每个div绑定onclick事件,按照索引顺序,点击第一个div时弹出0,点击第2个div时弹出1,以此类推。
<body>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</body>
//闭包的使用 var nodes = document.getElementsByTagName('div');
for(var i=0;i<nodes.length;i++){
nodes[i].onclick = function(){
console.log(i);
}
}
//思考一下,存在什么问题??
// 点击每一个打印的都是5是不是··· var nodes = document.getElementsByTagName('div');
for(var i=0;i<nodes.length;i++){
(function(i){ //块级作用域或私有作用域
nodes[i].onclick = function(){
console.log(i);
}
})(i)
}
//上述方法优点:把每次循环的i值都封闭起来
(5)使用闭包的注意点 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,
所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。
JavaScript的闭包详解的更多相关文章
- Javascript函数闭包详解(通俗易懂
许多书上闭包过于复杂讲解难懂,自己理解了一下并总结啦~ 讲闭包之前,需要先明白以下几个概念. 总之,函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域. 1.执行上下文(executi ...
- 从mixin到new和prototype:Javascript原型机制详解
从mixin到new和prototype:Javascript原型机制详解 这是一篇markdown格式的文章,更好的阅读体验请访问我的github,移动端请访问我的博客 继承是为了实现方法的复用 ...
- JavaScript严格模式详解
转载自阮一峰的博客 Javascript 严格模式详解 作者: 阮一峰 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict m ...
- [转]javascript console 函数详解 js开发调试的利器
javascript console 函数详解 js开发调试的利器 分步阅读 Console 是用于显示 JS和 DOM 对象信息的单独窗口.并且向 JS 中注入1个 console 对象,使用该 ...
- javascript 节点属性详解
javascript 节点属性详解 根据 DOM,html 文档中的每个成分都是一个节点 DOM 是这样规定的:整个文档是一个文档节点每个 html 标签是一个元素节点包含在于 html 元素中的文本 ...
- (" use strict")Javascript 严格模式详解
Javascript 严格模式详解 转载别人的博客内容,浏览了一遍,没有全部吸收,先保存一下链接 http://www.ruanyifeng.com/blog/2013/01/javascript_s ...
- Python闭包详解
Python闭包详解 1 快速预览 以下是一段简单的闭包代码示例: def foo(): m=3 n=5 def bar(): a=4 return m+n+a return bar >> ...
- 【HANA系列】SAP HANA XS使用JavaScript数据交互详解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Jav ...
- JavaScript运行机制详解
JavaScript运行机制详解 var test = function(){ alert("test"); } var test2 = function(){ alert(& ...
随机推荐
- codevs2618核电站问题
/* 因为m为连续放的个数 所以状态要包括这个条件 定义状态:f[n][m]表示第n个坑连续放了m个 转移:分两种 1. 第x个坑 放 即m>=1 则 f[x][k]=f[x-1][k-1] 2 ...
- HTML5中的二进制大对象Blob(转)
HTML5中的Blob对象和MYSQL中的BLOB类型在概念上是有点区别的.MYSQL中的BLOB类型就只是个二进制数据容器.而HTML5中的Blob对象除了存放二进制数据外还可以设置这个数据的MIN ...
- java学习第一阶段——面向对象
你聪明有人会说你心机重, 你靠的是努力有人会说你运气好, 你说自己天生乐观有人会说你虚假, 有时候, 你明明就是一杯白水, 却被人硬生生逼成了满肚子憋屈的碳酸饮料. 人一生要遇见太多人, 即使有些话字 ...
- 【USACO 1.5.4】跳棋的挑战
[问题描述] 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子,如下例,就是一种正确的布局. 上面的布局可以用 ...
- POJ 1155 树形背包(DP) TELE
题目链接: POJ 1155 TELE 分析: 用dp[i][j]表示在结点i下最j个用户公司的收益, 做为背包处理. dp[cnt][i+j] = max( dp[cnt][i+j ...
- 分享Git的一些个人配置
先贴上自己.gitconfig的相关命令,我再具体说一下 diff.external=~/.git-meld.sh http.sslverify=false http.proxy=http://127 ...
- Date.prototype.format,js下的时间格式处理函数
该方法在date的原型中扩展了format方法,使其可以方便的格式化日期格式输出. Date.prototype.format =function(format) { var o = { , //mo ...
- jquery easy ui 学习 (5) windowlayout
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Can't connect to local MySQL server through socket
今天上午在测试代码的时候发现在执行写mysql的时候总是超时,然后失败,使用mysql命令 show processlist; 发现有两条update的sql语句已经执行了很长时间,以为是这两个程序把 ...
- Pku1947 Rebuilding Roads
题意是给一棵树,问最少删掉几条边.使得剩下的子树中有节点个数为m个的 设f[i][j]表示i号点所在的子树中选了j个点至少需要删去f[i][j]条边. code: #include<cstdio ...