摘要:我们可以用普通函数内部嵌套匿名函数,形成一个闭包来使变量驻留在内存中。局部变量闭包为什么要将赋值给变量呢这里我们就要谈到匿名函数调用问题匿名函数如何调用还是上面的例子会将整个函数体打印出来这样才调用了函数内部的匿名函数看到这里。
闭包含义:
闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在
一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。
这个时候我们就要谈到匿名函数了.
匿名函数
匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数。看例子:
function box () { //这是一个普通函数 return "anonymous"; } alert(box());
那么匿名函数是什么呢?看例子:
function () { return "anonymous"; }
这个函数并没有执行!!!
如果让匿名函数执行呢。我们可以将匿名函数赋值给一个变量:
var box = function (){ return "anonymous"; }; alert(box()); //anonymous
但是这种表达式有时候并没有什么含义,那我们可以用自执行的方法去调用匿名函数:
(function () { alert("anonymous"); })();
匿名函数如何传参呢?看例子:
(function (a) { alert(a); })(100); //alert返回100匿名函数和闭包的作用
谈到闭包,我们就不得不谈到全局变量和局部变量。
全局变量:
全局变量在实际写项目中个人额不建议使用,因为大量的全局变量会污染代码,每个模块都可以去地道用,必将引来很多错误。所以推荐变量私有化。
什么是变量私有化?
var a = 100; //全局变量 function box () { alert(a); } box(); //调用函数返回100
通过上面的代码可以看出,每个函数内都可以调用外部的局部变量。将a变量变成了公有化的变量,有时候我们并不希望这么做。所以我们可以将变量定义在函数内部使变量变成私有化变量,外部无法访问到这个变量
function box () { var a = 100; //局部变量 } alert(a); //a is not defined
这就完事了么?并没有!!记住一点:局部变量在每次调用时都会初始化!!!(重要的事情用三个感叹号...)
我们来用一个后置递增的一个小例子来告诉大家:
function a () { var b = 100; b++; return b; } alert(a()); //101 alert(a()); //101
不难看出,每次调用,变量b都会被初始化,所以每次调用都会返回101而不是累加。我们可以用普通函数内部嵌套匿名函数,形成一个闭包来使变量驻留在内存中。
function a () { var b = 100; //局部变量 return function () { //闭包 b++; return b; }; } var c = a(); alert(c()); //101 alert(c()); //102
为什么要将a()赋值给变量c呢?这里我们就要谈到匿名函数调用问题:
匿名函数如何调用?还是上面的例子:
function a () { var b = 100; return function () { return b; }; } alert(a()); //会将整个函数体打印出来 alert(a()()); //这样才调用了函数内部的匿名函数
看到这里。大家应该理解了为什么要将a()赋值给c变量了吧?因为如果直接使用a()();这样去调用,每次调用还是会初始化局部变量,而我们赋值给变量c,外层函数被调用了一次赋值给了C,而每次调用C去调用内部的匿名函数,从而达到了闭包。
我会在下一章继续讲闭包,欢迎大家来纠正错误及指正!
Brian Lee
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/80986.html
摘要:关于循环和闭包当循环和闭包结合在一起时,经常会产生让初学者觉得匪夷所思的问题。闭包是一把双刃剑是比较难以理解和掌握的部分,它十分强大,却也有很大的缺陷,如何使用它完全取决于你自己。 在谈闭包之前,我们首先要了解几个概念: 什么是函数表达式? 与函数声明有何不同? JavaScript查找标识符的机制 JavaScript的作用域是词法作用域 JavaScript的垃圾回收机制 先来...
摘要:在内部,理所当然能访问到局部变量,但当作为的返回值赋给外的全局变量时,神奇的事情发生了在全局作用域中访问到了,这就是闭包。而闭包最神奇的地方就是能在一个函数外访问函数中的局部变量,把这些变量用闭包的形式放在函数中便能避免污染。 一、闭包是什么? 《JavaScript高级程序设计》中写道:闭包是指有权访问另一个函数作用域中的变量的函数,如果用下定义的观点看,这句话就是说闭包是函数,我...
摘要:将作用域赋值给变量这里的作用域是,而不是将作用域赋值给一个变量闭包返回浏览器中内存泄漏问题大家都知道,闭包会使变量驻留在内存中,这也就导致了内存泄漏。 上一章我们讲了匿名函数和闭包,这次我们来谈谈闭包中作用域this的问题。 大家都知道,this对象是在运行时基于函数的执行环境绑定的,如果this在全局就是[object window],如果在对象内部就是指向这个对象,而闭包却是在运行...
摘要:接上回我写了一篇关于闭包的博客学习之闭包,最后谈到闭包导致的问题时留了一个尾在以下的浏览器中会有内存泄漏的问题。今天的博客就继续探索一下内存泄漏的问题。博客地址的前端之路原文链接学习之内存泄漏 接上回我写了一篇关于闭包的博客《学习JavaScript之闭包》, 最后谈到闭包导致的问题时留了一个尾: 在IE9以下的浏览器中会有内存泄漏的问题。 今天的博客就继续探索一下内存泄漏的问题。 浅...
阅读 995·2023-04-26 02:26
阅读 2029·2021-09-26 10:16
阅读 1488·2019-08-30 12:57
阅读 3393·2019-08-29 16:10
阅读 3136·2019-08-29 13:47
阅读 1116·2019-08-29 13:12
阅读 2063·2019-08-29 11:11
阅读 1272·2019-08-26 13:28