深入了解JavaScript的闭包机制

时间: 2019-03-26阅读: 572标签: 闭包

JavaScript 变量可以是局部变量或全局变量。 私有变量可以用到闭包。


全局变量

函数可以访问是有函数内部定义的变量,如:


实例

function myFunction() {
  var a = 4;
  return a * a;
}

函数也可以访问函数外部定义的变量,如: 实例

var a = 4;
function myFunction() {
  return a * a;
}

后面一个实例中, a 是一个 全局 变量。 在web页面中全局变量属于 window 对象。 全局变量可应用于页面上的所有脚本。 在第一个实例中, a 是一个 局部 变量。 局部变量只能用于定义它函数内部。对于其他的函数或脚本代码是不可用的。 全局和局部变量即便名称相同,它们也是两个不同的变量。修改其中一个,不会影响另一个的值。


Note

变量声明是如果不使用 var 关键字,那么它就是一个全局变量,即便它在函数内定义。


变量生命周期

全局变量的作用域是全局性的,即在整个JavaScript程序中,全局变量处处都在。 而在函数内部声明的变量,只在函数内部起作用。这些变量是局部变量,作用域是局部性的;函数的参数也是局部性的,只在函数内部起作用。


计数器困境

设想下如果你想统计一些数值,且该计数器在所有函数中都是可用的。 你可以使用全局变量,函数设置计数器递增: 实例

var counter = 0;
 
function add() {
  counter += 1;
}
 
add();
add();
add();
//在此我向大家推荐一个前端全栈开发交流圈:619586920 突破技术瓶颈,提升思维能力 
// 计数器现在为 3

计数器数值在执行 add() 函数时发生变化。 但问题来了,页面上的任何脚本都能改变计数器,即便没有调用 add() 函数。 如果我在函数内声明计数器,如果没有调用函数将无法修改计数器的值: 实例

function add() {
  var counter = 0;
  counter += 1;
}
 
add();
add();
add();
 
// 本意是想输出 3, 但事与愿违,输出的都是 1 !

以上代码将无法正确输出,每次我调用 add() 函数,计数器都会设置为 1。 JavaScript 内嵌函数可以解决该问题。


JavaScript 内嵌函数

所有函数都能访问全局变量。
实际上,在 JavaScript 中,所有函数都能访问它们上一层的作用域。 JavaScript 支持嵌套函数。嵌套函数可以访问上一层的函数变量。 该实例中,内嵌函数 plus() 可以访问父函数的 counter 变量: 实例

function add() {
  var counter = 0;
  function plus() {counter += 1;}
  plus();  
  return counter; 
}//在此我向大家推荐一个前端全栈开发交流圈:619586920 突破技术瓶颈,提升思维能力

如果我们能在外部访问 plus() 函数,这样就能解决计数器的困境。 我们同样需要确保 counter = 0 只执行一次。 我们需要闭包。


JavaScript 闭包

还记得函数自我调用吗?该函数会做什么?

var add = (function () {
  var counter = 0;
  return function () {return counter += 1;}
})();
 
add();
add();
add();
//在此我向大家推荐一个前端全栈开发交流圈:619586920 突破技术瓶颈,提升思维能力 
// 计数器为 3

实例解析 变量 add 指定了函数自我调用的返回字值。 自我调用函数只执行一次。设置计数器为 0。并返回函数表达式。 add变量可以作为一个函数使用。非常棒的部分是它可以访问函数上一层作用域的计数器。 这个叫作 JavaScript 闭包。它使得函数拥有私有变量变成可能。 计数器受匿名函数的作用域保护,只能通过 add 方法修改。


Note

闭包是可访问上一层函数作用域里变量的函数,即便上一层函数已经关闭。


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/2527

关闭

使用闭包的方式实现一个累加函数 addNum

使用闭包的方式实现一个累加函数 addNum,参数为 number 类型,每次返回的结果 = 上一次计算的值 + 传入的值

JavaScript必须掌握的基础 --- 闭包

闭包是一个让初级JavaScript使用者既熟悉又陌生的一个概念。因为闭包在我们书写JavaScript代码时,随处可见,但是我们又不知道哪里用了闭包。

JavaScript 作用域、命名空间及闭包

变量作用域:一个变量的作用域是程序源代码中定义这个变量的区域,在函数内声明的变量是局部变量,它只在该函数及其嵌套作用域里可见(js 函数可嵌套定义);

如何才能通俗易懂的解释js里面的‘闭包’?

即变量都存在在指定的作用域中,如果在当前作用中找不到想要的变量,则通过作用域链向在父作用域中继续查找,直到找到第一个同名的变量为止(或找不到,抛出 ReferenceError 错误)。这是 js 中作用域链的概念

闭包的作用及优缺点

在面试题中,闭包应该是必问的问题吧,下面我们就简单的了解一下闭包这个东西到底是什么?单来说就是一个定义在函数内部的函数,可以读取到其他函数内部变量的函数

Js中闭包的概念、原理、作用及应用

闭包:有权访问另一个函数作用域中的变量的函数,一般情况就是在一个函数中包含另一个函数。从官方定义我们知道闭包是一个函数,只不过这个函数有[超能力],可以访问到另一个函数的作用域。为什么说这个叫做[超能力]呢?

Js中的闭包与高级函数

在JavaScript中,函数是一等公民。JavaScript是一门面向对象的编程语言,但是同时也有很多函数式编程的特性,如Lambda表达式,闭包,高阶函数等,函数式编程时一种编程范式。

JS 原生闭包模块化开发总结

闭包模块的第一种写法;闭包模式的第二种写法;闭包模式的自动实例化对象的写法;闭包类的方法注入模式写法;

JS之闭包的定义及作用

在学习闭包之前,你必须清楚知道JS中变量的作用域。JS中变量的作用域无非就全局变量和局部变量,两者之间的关系是函数内部可以直接访问全局变量,但是函数外部是无法读取函数内部的局部变量的

javascript中闭包最简单的介绍

JavaScript 变量可以是局部变量或全局变量。私有变量可以用到闭包。闭包就是将函数内部和函数外部连接起来的一座桥梁。函数的闭包使用场景:比如我们想要一个函数来执行计数功能。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!