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 ); } --上面这段 ...
随机推荐
- c# 合并两个有序数组
, , , , , }; , , , }; ArrayList lists = new ArrayList(); ArrayList temp = new ArrayList(); lists.Add ...
- 解决oracle数据库 ora-00054:resource busy and acquire with NOWAIT specified 错误
解决oracle数据库 ora-00054:resource busy and acquire with NOWAIT specified 错误 本人在使用pl/sql developer 客户端调用 ...
- js的数据类型--数字
近期做一些项目的时候发现,自己的js基础还是不够扎实,再看一遍犀牛书,加深自己的理解和印象.所以从这篇文章开始,后面都是关于原生js的一些内容. 这篇文章,我们具体介绍一下js的数据类型其中一种. j ...
- UVA 11440 Help Tomisu
https://vjudge.net/problem/UVA-11440 题意: 求2——n! 之间有多少个整数x,满足x的所有素因子都大于m 保证m<=n x的所有素因子都大于m 等价于 x和 ...
- NOJ/HUST 1095 校赛 Just Go 线段树模板题
Description There is a river, which contains n stones from left to right. These stones are magic, ea ...
- MySQL按天,按周,按月,按时间段统计
MYSQL函数:DATE_FORMAT 例子: select DATE_FORMAT(create_time,'%Y%m%d') days,count(caseid) count from tc_ca ...
- SpringBoot jar包不支持jsp
官方原文如下: When running a Spring Boot application that uses an embedded servlet container (and is packa ...
- [uva11806]容斥定理
n*m的矩形 k个人 第一行,最后一行,第一列,最后一列都至少站有一个人 小水题 正着做不好做,要反着想,那就容斥定理,ABCD四种情况分别是那四个行列分别没有人. #include<cstdi ...
- 【BZOJ4869】相逢是问候 [线段树][欧拉定理]
相逢是问候 Time Limit: 40 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description Informatikverbin ...
- 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)
[题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...