JavaScript 闭包(随笔)
闭包,伟大的闭包.... 先看看百科对百度的定义是什么样的。
百科说:闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。
看完整个人都不好了。 这都是什么鬼???
还是自己总结下:
什么样才能产生闭包?在javascript技术层面上来说父函数嵌套子函数的形式就可能会产生闭包函数。如这样的:
//闭包函数fn的创建
function fn (){
var a = 2;
var b = 4;
function fn1(){
console.log(a);
};
fn1();
}
fn();
解析:fn1.[[scope]] --> fn.lexical environme || fn.[[scope]] //
闭包的个人理解:
在创建fn1子函数的时候会给fn1加一个scope属性,而这个属性指向的是fn父函数的词法环境。如果fn函数还有父函数的话,fn的scope属性又指向该函数的父级函数的词法环境,如此就形成了一个作用域链。
所以闭包的本质是因为JS支持这种作用域链而且还支持函数嵌套函数才会导致有闭包的可能。嗯。。 就是这个原因!!!
1、在子函数内部不调用父函数的任何自由变量此时不会有闭包产生;
2、在子函数的子涵内部用父函数的父函数的任何自由变量此时会产生闭包;
如:
//第一种情况:不会产生闭包
function fn (){
var j = 4;
function fn1(){
console.log("子函数代码内部没调用符函数的任何东西,不会产生闭包;")
};
fn1();
};
fn();
//第二种情况:产生闭包
function fm(){
var k = 5;
function fm1(){
var y = 9;
function fm2(){
console.log(k) //此函数调用了父级的父级函数内部的变量则会有闭包产生; closure -> k:5
};
fm2();
};
fm1();
};
fm();
闭包的简单例子:
// 计算base 和 max 的和,但是max要从1一直加到max的值然后与base相加;(利用闭包的来做的话可以减少定义全局变量的数量)
function calfu (base){
return function (max){
var total = 0;
for (var i =1; i <= max; i++) {
total = total + i;
}
return total + base;
};
};
var reult = calfu(2);
reult(3) // 1+2+3+2 == 8
alert(reult(3)); //弹出结果为8
最后来一句:
“由于闭包携带包含它的函数的作用域,因此会比其他函数占用更多的内存。过度使用闭包可能会导致内存占用过多,我们建议读者只在绝对必要时再考虑使用闭包。虽然像
V8等优化后的Javascript引擎会尝试回收被闭包占用的内存,但请大家还是要慎重使用闭包。”
嗯。 对。这是大神说的话。。慎重,慎重,再慎重....
JavaScript 闭包(随笔)的更多相关文章
- javascript闭包详解
以前写过一篇关于javascript闭包的随笔,javascript闭包,但是写的不够详细,也没有体现出闭包的强大之处.故作此篇. 众所周知,javascript没有块级作用域,只有函数作用域.那就意 ...
- 《Web 前端面试指南》1、JavaScript 闭包深入浅出
闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...
- JavaScript 闭包深入浅出
闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...
- JavaScript闭包(Closure)
JavaScript闭包(Closure) 本文收集了多本书里对JavaScript闭包(Closure)的解释,或许会对理解闭包有一定帮助. <你不知道的JavsScript> Java ...
- Javascript闭包和C#匿名函数对比分析
C#中引入匿名函数,多少都是受到Javascript的闭包语法和面向函数编程语言的影响.人们发现,在表达式中直接编写函数代码是一种普遍存在的需求,这种语法将比那种必须在某个特定地方定义函数的方式灵活和 ...
- javascript闭包理解
//闭包理解一 function superFun(){ var _super_a='a'; function subfuc(){ console.log(_super_a); } return su ...
- Javascript闭包深入解析及实现方法
1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点:1. 作为一个函数变量的一个引用,当函数返回时 ...
- javascript闭包和作用域链
最近在学习前端知识,看到javascript闭包这里总是云里雾里.于是翻阅了好多资料记录下来本人对闭包的理解. 首先,什么是闭包?看了各位大牛的定义和描述各式各样,我个人认为最容易一种说法: 外部函数 ...
- JavaScript闭包深入解析
for (var i=1; i<=5; i++) { setTimeout( function timer() { console.log( i ); }, i*1000 ); } --上面这段 ...
随机推荐
- oepncv-学习笔记一
安装opencv文件时若需要cmake编译,如果中间出现 解决办法是: 在opencv的文件中找到包含cmakelist.txt的文件夹,把where is the source code:的路径改成 ...
- sql service 事务与锁
了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死锁: ...
- vijos 1426 背包+hash
背景 北京奥运会开幕了,这是中国人的骄傲和自豪,中国健儿在运动场上已经创造了一个又一个辉煌,super pig也不例外……………… 描述 虽然兴奋剂是奥运会及其他重要比赛的禁药,是禁止服用的.但是运动 ...
- redis.conf 配置
daemonize yes #以后台daemon方式运行redis pidfile "/var/run/redis.pid" #redis以后台运行,默认pid文件路径/var/r ...
- 【BZOJ】4530: [Bjoi2014]大融合
[题意]给定n个点的树,从无到有加边,过程中动态询问当前图某条边两端连通点数的乘积,n<=10^5. [算法]线段树合并+并查集 (||LCT(LCT维护子树信息 LCT维护子树信息(+启发式合 ...
- FileReader 与canvas结合使用显示图片
话不多少,直接上代码 function fileChange() { var file = this.files[0]; var imageType = /^image\//; //是否是图片 if ...
- 边绘边理解prototype跟__proto__
网上流传着一张讲解prototype跟__proto__关系的图,尽管他已经描绘的很清楚了,但对于初学者来说,江太公感觉还是过于纠结,于是起心重绘,让他们之间的关系更加明晰可理解,一方面出于分享目的, ...
- ie8下input文字偏上select文字偏下
1.ie8下input文字偏上 正常情况下input的显示情况如下 当设置input的高度时,就会出现文字不垂直居中偏上的情况,如图 解决方案 强input的行高line-height与其高度设置一致 ...
- bootstrap-table组合表头
1.效果图 2.html代码 <table id="table"></table> 3.javascript代码 $("#table") ...
- 20179205《Linux内核原理与分析》第一周作业
输出 shiyanlou 图形字符的命令banner: 新建用户wangyazhe,输入密码不会显示出来: 利用sudo adduser添加一个用户 loutest,mkdir创建一个新的文件夹opt ...