闭包

JS闭包函数和回调函数

僤鯓⒐⒋嵵緔 提交于 2019-12-07 15:55:00
一、闭包 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。闭包就是能够读取其他函数内部变量的函数。可以把闭包简单理解成”定义在一个函数内部的函数”。 闭包有三个特性: 1.函数嵌套函数; 2.函数内部可以引用外部的参数和变量; 3.参数和变量不会被垃圾回收机制回收。 闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。使用闭包有一个优点,也是它的缺点,就是可以把局部变量驻留在内存中,可以避免使用全局变量。全局变量在每个模块都可调用,这势必将是灾难性的。所以推荐使用私有的,封装的局部变量。一般函数执行完毕后,局部活动对象就被销毁,内存中仅仅保存全局作用域。但闭包的情况不同! 示例一: //闭包就是一个函数的返回值为另外一个函数,在outer外部可以通过这个返回的函数访问outer内的局部变量. function outer () { var val = 0 ; return function () { val += 1 ; document.write(val + "<br />" ); }; } var outObj = outer(); outObj(); //1,执行val += 1后,val还在 outObj(); //2

JS中的匿名函数和闭包

泄露秘密 提交于 2019-12-07 15:54:50
定义函数的方式有两种,一是 函数声明 ,二是通过 函数表达式 。 函数声明的方式如下所示: function functionName(arg0,arg1,arg2){ //函数体 } 函数表达式: var functionName=function(arg0,arg1,arg2){ } 匿名函数 又称拉姆达函数,其定义是由函数表达式模式创建的函数,即创建一个函数并将它复制给变量。其特点是function关键字后面没有标识符。匿名函数的name属性是空字符串。 闭包 是指有权访问另一个函数作用域的变量的函数。创建闭包常见的方式就是在一个函数内部创建另一个函数。 下面的函数定义即为一个闭包: function createFunction(){ var result=new Array(); for(var i=0;i<10;i++){ result[i]=function(){ return i; }; } return result; } 由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存。过度使用闭包可能会导致内存占用过多。 闭包与变量 由于作用域链的存在,闭包只能取得包含函数中任何变量的最后一个值。 如下代码所示为解决实际问题中的闭包与变量的问题: for(var i=0;i 来源: CSDN 作者: yihuoZhou 链接: https://blog

js闭包函数的实例

China☆狼群 提交于 2019-12-07 15:54:22
今天用了一天的时间,看了一下关于js的闭包函数。好像是明白了它的含义以及用法。如果欠考虑了,希望能指出。函数定义和函数表达式 位于另一个函数体内,而且 这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数 , 就叫做 闭包函数 。 实例 <script type="text/javascript"> // 测试是否 身体比例 身高和体重比例是否正常 // 体质指数=体重(公斤) ÷ 身高(米)的平方 kg/m^2 // 算式写法: BMI = 体重 / (身高)^2 // 正常体重 : 体重指数 = 18.5 - 24 (中国体质标准:正常范围 18.5~23.9,超重24.0~27.9,肥胖≥28.0) // 超重 : 体重指数 = 24 - 30 // 轻度肥胖 : 体重指数 > 30 // 中度肥胖 : 体重指数 > 35 // 重度肥胖 :体重指数 > 40 var test = function() { var obj = new Object(); obj.name = 'kevin'; obj.isHealthy = function(w,h) { h = h/100; var re = w/(h*h); console.log(re); if (re < 18.5){ return '体重轻了'; }else if (re >=18

详解JavaScript中的函数与闭包

我是研究僧i 提交于 2019-12-07 15:54:03
闭包这东西,说难也难,说不难也不难,下面我就以自己的理解来说一下闭包。 一、闭包的解释说明 对于函数式语言来说,函数可以保存内部的数据状态。对于像C#这种编译型命令式语言来说,由于代码总是在代码段中执行,而代码段是只读的,因此函数中的数据只能是静态数据。函数内部的局部变量存放在栈上,在函数执行结束以后,所占用的栈被释放,因此局部变量是不能保存的。 Javascript采用词法作用域,函数的执行依赖于 变量作用域 , 这个作用域是在定义函数时确定的 。因此Javascript中函数对象不仅保存代码逻辑,还必须引用当前的作用域链。Javascript中函数内部的局部变量可以被修改,而且当再次进入到函数内部的时候,上次被修改的状态仍然持续。这是因为因为局部变量并不保存在栈上,而是通过一个对象来保存。 决定使用哪个变量是查找作用域链后决定的。 1.每次 定义函数时 ,都会为之创建一个作用域链; 2.每次 调用函数时 ,会创建一个新的对象用来保存变量(局部变量和参数),并且把这个用于保存变量的对象加入作用域链前端。 如果没有局部变量的话,这个保存变量的对象就只包含arguments,也就是用来保存参数。设想这么一种情况,如果内层函数定义时恰逢外层函数正被调用执行,那么内层函数就会把外层函数运行时这个保存变量的对象纳入自己的作用域链中。 用代码来举例,外层匿名函数执行了10次

js中的匿名函数和闭包总结篇

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-07 15:52:23
匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数。 一.匿名函数 //普通函数 function box () { //函数名是box return 'Lee' ; } //匿名函数 function () { //匿名函数,会报错 return 'Lee' ; } //通过表达式自我执行 ( function () { //封装成表达式 alert( 'Lee' ); })(); ( function (age) { //封装成表达式 alert(age); })( 100 ); //()表示执行函数,并且传参 //第一圆括号放匿名函数,第二个圆括号执行; //把匿名函数赋值给变量 var box = function () { //将匿名函数赋给变量 return 'Lee' ; }; alert(box()); //调用方式和函数调用相似 //注意上面的括号 //函数里的匿名函数 function box () { return function () { //函数里的匿名函数,产生闭包 return 'Lee' ; } } alert(box()()); //调用匿名函数 二.闭包 闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。 //通过闭包可以 返回局部变量

JavaScript闭包函数及其作用

拟墨画扇 提交于 2019-12-07 15:52:08
一、认识闭包 案例: 页面有5个li标签,标签显示0~4五个数字,点击不同的标签在控制台中打印标签的索引。 主要代码: <ul> <li>0</li> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul> <script> var liList=document.getElementsByTagName("li"); for(var i=0;i<liList.length;i++){ liList[i].onclick=function(){ console.log(i); } } </script> 主要说明: 如果是你会不会这样写? 如果这样写,一旦运行就会发现不管点击那个标签打印的都是数字"5"。因为在执行点击操作时,for循环已经进行完毕且i值为"5"。那怎么做才能使每次循环时i值得以保存不被系统回收?闭包! 代码修改: <ul> <li>0</li> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul> <script> var liList=document.getElementsByTagName("li"); for(var i=0;i<liList.length;i++){ liList[i].onclick=(function(j){ return function(){

关于js中函数的闭包 深入了解

自闭症网瘾萝莉.ら 提交于 2019-12-07 15:51:19
闭包 就是能够读取其他函数内部变量的函数。 即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的 内部函数在包含它们的外部函数之外被调用时,就会形成闭包 。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。----- 个人理解就是:闭包是能够读取其他函数内部变量的函数,即在外面可以调用函数中的函数的变量,其实他就是 将函数内外部连接起来的桥梁 。 如下面例子4 : 这段代码有以下两个特点: 1 、 函数b 嵌套在函数a内部;2、函数a返回函数b; 引用关系如下图: 这样在执行完var c = a() 后,变量c实际上是指向了函数b,b中用到了变量i,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说: 当函数a 的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。 当函数b执行的时候亦会像以上步骤一样。因此,执行时b的作用域链包含了3个对象:b的活动对象、a的活动对象和window对象,如下图所示

javascript 匿名函数与闭包

元气小坏坏 提交于 2019-12-07 15:50:40
匿名函数 普通函数: function box () { return 'Lee' ; } alert(box()); 匿名函数: //单独的匿名函数 会报错 无法运行 也无法调用 //function() { // return 'Lee'; //} //通过表达式的自我执行 ( function () { alert( 'Lee' ); })(); //把匿名函数赋值给变量 var cat = function () { return 'Lee' ; }; alert(cat()); //调用 //把匿名函数自我执行的返回值赋值给变量 var box = ( function () { return 'Lee' ; })(); alert(box); //自我执行匿名函数的传参 ( function (num) { alert(num); })( 100 ); 闭包 闭包指有权访问另一个函数作用域里变量的函数 //函数里放一个匿名函数 ---闭包 function box () { return function () { return 'Lee' ; } } alert(box); // function box () { return function () { return 'Lee' }} alert(box());// function () { return

js函数闭包

大兔子大兔子 提交于 2019-12-07 15:50:24
闭包的好处: 希望一个变量长期驻扎在内存当中; 避免全局变量的污染; 私有成员的存在; 举例: function f1(x){ var a=1; return function f2(y){ console.log(x+y+(a++)); console.log(a); } } var b=f1(2);//x=2; b(10); //相当于b=f2 b()=f2(),故y=10;; 匿名函数: (function(){}); (); 该方法经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数影响全局作用域。也可以减少如闭包这样的对内存的占用,由于匿名函数没有变量指向,执行完毕就可以立即销毁其作用域链。 而js一个最大的好处也是奇特之处之一,就是函数可以直接读取全局变量; 而闭包,简单来说就是能够读取别的函数内部变量的函数,相当于内部函数与外部函数的一座桥梁,同时,子函数的变量会被一层层的向上级寻索,故父函数中所有变量都是子集可以获取到的,反之不成立。 来源: CSDN 作者: Syyyyy_ 链接: https://blog.csdn.net/weixin_43859703/article/details/88561266

javascript函数闭包

醉酒当歌 提交于 2019-12-07 15:50:10
1. 事件闭包的理解 闭包是指有权限访问另一个函数作用域中的变量的函数。 在 javascript 语言中,闭包就是函数和该函数作用域的组合。从这 个概念上来讲,在 js 中,所有函数都是闭包(函数都是对象并且函 数都有和他们相关联的作用域链 scope chain)。 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的 环境的表达式(通常是一个函数),因而这些变量也是该表达式的一 部分。其实这 句话通俗的来说就是:JavaScript 中所有的 function 都是一个闭包。 不过一般来说,嵌套的 function 所产生的闭包更为强大,也是大部 分时候我们所谓的“闭包”。 2. 变量的作用域 要理解闭包,首先必须理解 Javascript 特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript 语言的特殊之处,就在于函数内部可以直接读取全局 变量。 案例: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> // 闭包: 在js中任何一个函数都是一个闭包,但是嵌套的函数闭包作用会更大; // 闭包: 一个函数中的变量 可以被其他函数所访问 //问题: 如何从外部读取函数内部的变量? /