JavaScript闭包相关知识解析

 更新时间:2019年10月19日 09:25:45   作者:鳕鱼堡  
这篇文章主要介绍了JavaScript闭包相关知识解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

闭包是JavaScript中的一个难点,同时也是它的特色,JavaScript的很多高级应用都要依靠闭包来实现。以下是我学习闭包的记录,希望对你有些帮助。

变量作用域

在学习闭包之前,我们首先要理解JavaScript不同与其他语言独特的变量作用域。在JavaScript中,不存在局部作用域的概念,但是有全局作用域以及函数作用域。全局作用域与其他语言的相同,没有需要注意的地方,而函数作用域是指函数内部声明的变量在函数外部无法直接访问。

var a = 99;
function f1() {
  console.log(a);
}
f1();

上面的代码中,f1可以读取到全局变量a,而下面的代码中a无法被访问。

function f1() {
  var a = 99;
}
console.log(a);

如何从外部读取函数内部声明的变量?

在某些情况下,我们可能需要得到函数内部的变量,正常情况下是无法做到的,因此需要用特殊的办法。

function f1() {
  var a = 99;
  function f2() {
    console.log(a);
  }
}

上面代码中,我们在函数f1中定义另一个函数f2,这样f1中的所有变量对于f2来说就是可见的,既然f2可以读取到f1中的变量,那么我们只要把f2作为f1的返回值,我们就可以在f1的外部读取到它内部的变量了。

function f1() {
  var a = 99;
  function f2() {
    console.log(a);
  }
  return f2;
}
var result = f1();
result();

此时,就形成了一个简单的闭包。因此,闭包就可以简单的理解为函数中的函数,而本质上,闭包就是一个连接函数内部和外部的桥梁。

闭包的特性

闭包会使得函数中的变量都被保存到内存中。首先我们先看一下以下两个例子

function A() {
  var count = 0;
  function B() {
    count++;
    console.log(count);
  }
  return B;
}
var C = A();
C(); // 1
C(); // 2
C(); // 3

count是函数A中的一个变量,它的值在函数B中被改变,函数B每执行一次,count的值就在原来的基础上累加1,因此,函数A中的count变量会一直保存在内存中。

function A(x) {
  function B(y) {
    console.log(x+y);
  }
return B;
}
var C = A(3);
C(5); //8

当3传入A函数后,B函数就会记住这个值,所以在后面传入5的时候只会对B函数中的y赋值,所以最后会输出8。

使用闭包的注意点

由于上述闭包的特性,每次使用闭包都会大量增加内存的消耗,所以不能滥用闭包,否则会影响网页的性能。我们也可以在函数退出前,使函数内变量指向null来手动删除变量。我们可以来看下一道经典的面试题来理解。

function outer(){
  var num = 0; //内部变量
  return function add() { //通过return返回add函数,就可以在outer函数外访问了
    num++; //内部函数有引用,作为add函数的一部分了
    console.log(num);
  };
}
var func1 = outer();
func1(); //实际上是调用add函数, 输出1
func1(); //输出2 因为outer函数内部的私有作用域会一直被占用
var func2 = outer();
func2(); // 输出1 每次重新引用函数的时候,闭包是全新的。
func2(); // 输出2 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 实时编辑网页网页文字实时编辑,如同TEXTBOX一般

    实时编辑网页网页文字实时编辑,如同TEXTBOX一般

    实时编辑网页网页文字实时编辑,如同TEXTBOX一般...
    2007-03-03
  • 炫酷的js手风琴效果

    炫酷的js手风琴效果

    既然JQ和JS都能实现那么炫酷的效果,我们用CSS3能不能做出手风琴效果的书签来呢?这篇文章主要为大家分享了炫酷的手风琴效果实现方式,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • JavaScript+Canvas实现简单的柱状图

    JavaScript+Canvas实现简单的柱状图

    这篇文章主要为大家详细介绍了JavaScript如何利用Canvas实现绘制简单的柱状图,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • JS 中forEach,for in、for of用法实例总结

    JS 中forEach,for in、for of用法实例总结

    这篇文章主要介绍了JS 中forEach,for in、for of用法,结合实例形式总结分析了JS 中forEach,for in、for of的基本功能、使用方法与相关注意事项,需要的朋友可以参考下
    2023-05-05
  • 分享javascript计算时间差的示例代码

    分享javascript计算时间差的示例代码

    这篇文章主要为大家介绍了javascript计算时间差的示例代码,,一般来说都是计算当前时间和一个指定时间点之间的差距,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • js事件源window.event.srcElement兼容性写法(详解)

    js事件源window.event.srcElement兼容性写法(详解)

    下面小编就为大家带来一篇js事件源window.event.srcElement兼容性写法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • TypeScript安装与使用的详细教程

    TypeScript安装与使用的详细教程

    TypeScript是JavaScript的超集,扩展了JavaScript的语法,因此现有的JavaScript代码可与TypeScript一起工作无需任何修改,TypeScript通过类型注解提供编译时的静态类型检查,下面这篇文章主要给大家介绍了关于TypeScript安装与使用的详细教程,需要的朋友可以参考下
    2023-01-01
  • JavaScript编程的10+最佳实践解决方案

    JavaScript编程的10+最佳实践解决方案

    在现代Web开发中,JavaScript已经成为无法替代的核心技术,在现代Web开发中,JavaScript已经成为无法替代的核心技术,本文将通过代码示例详细介绍一些实践解决方案,感兴趣的同学可以参考下
    2023-06-06
  • TopList标签和JavaScript结合两例

    TopList标签和JavaScript结合两例

    TopList标签和JavaScript结合两例...
    2007-08-08
  • highcharts.js数据绑定方式代码实例

    highcharts.js数据绑定方式代码实例

    这篇文章主要介绍了highcharts.js数据绑定方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论