美文网首页
作用域/变量回收/闭包

作用域/变量回收/闭包

作者: luu | 来源:发表于2018-11-13 20:44 被阅读0次

所有变量(包括基本类型和引用类型)都存在于一个执行环境(也称作作用域)当中。这个变量决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。

变量的执行环境有助于确定应该何时释放内存。

JS是一门具有自动垃圾收集机制的编程语言。离开作用域的值将被自动标记为可以回收,在垃圾收集期间被删除。

当函数内部定义了其它函数时,就创建了闭包。闭包的作用域链包含自己的作用域、包含函数(外部函数)的作用域和全局作用域。通常函数作用域及其所有变量都会在函数执行结束后被销毁,但是当函数返回一个闭包时,这个函数的作用域会一直在内存中保存到闭包不存在为止。

function f1() {
  var n = 999;
  function f2() {
    console.log(n);
  }
  return f2;
}

var result = f1();
result(); // 999

f2可以读取f1的局部变量,要把f2作为返回值,可以在f1外部读取它的内部变量。

function createIncrementor(start) {
  return function () {
    return start++;
  };
}

var inc = createIncrementor(5);

inc() // 5
inc() // 6
inc() // 7

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();

add() //1
add() //2
add() //3

注意: 为什么上面这段代码没有直接写的 function add (){...} 而是把function赋值给了变量add呢?

我们通常会想当然的认为每次调用 add() 都会重走一遍add()中的代码块, 但其实不然。

注意add方法中的return, 它return的并不是1,2,3这样的数值,而是return了一个方法,并且把这个方法赋值给了add变量。

那么在这个function自运行一遍之后,其实最后赋值给add的是return counter += 1 这段代码。

所以后面每次调用add() 其实都是在调用return counter += 1。

再结合之前所说的, 闭包会持有父方法的局部变量并且不会随父方法销毁而销毁, 所以这个counter其实就是来自于第一次function执行时创建的变量。

使用闭包可以模仿块级作用域。

闭包还可以用于在对象中创建私有变量。

function Person(name) {
  var _age;
  function setAge(n) {
    _age = n;
  }
  function getAge() {
    return _age;
  }

  return {
    name: name,
    getAge: getAge,
    setAge: setAge
  };
}

var p1 = Person('张三');
p1.setAge(25);
p1.getAge() // 25

创建闭包必须维护额外的作用域,过度使用它们可能会占用大量内存。

相关文章

  • javaScript门道之闭包

    闭包的学习路径:变量的作用域 -> 闭包的概念 ->闭包的应用 1.变量的作用域 变量的作用域分为作用于全局和作用...

  • 2018-07-11

    深入理解闭包: 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非...

  • JavaScript---闭包

    闭包,首先搞清楚两件事:1、变量的作用域 2、垃圾回收机制 一:变量的作用域 1、变量的作用域无非就是两种:全局变...

  • 浓缩解读《JavaScript设计模式与开发实践》③

    三、闭包和高阶函数 3.1 闭包 3.1.1 变量的作用域 所谓变量的作用域,就是变量的有效范围。通过作用域的划分...

  • 闭包和高阶函数学习笔记

    一、闭包 闭包的形成与变量的作用域以及变量的生存周期密切相关。 1.1 变量的作用域 变量的作用域:指变量的有效范...

  • 闭包、定时器

    一、什么是闭包? 有什么作用 1.变量的作用域  要理解闭包,首先必须理解JavaScript的变量作用域。变量的...

  • js闭包

    由于作用域的关系,函数之间不能相互读取变量,父级作用域不能读取子级作用域的变量。这是闭包出现了。 闭包 闭包就是能...

  • 闭包

    闭包:函数中的函数,可访问另一个函数作用域内的变量,且这变量不被垃圾回收; 作用 防止对全局作用域污染;保护函数内...

  • 那些年我们一起干过的事------闭包(详解)

    对闭包如何理解 要想了解闭包,首先看一下变量作用域。 一、变量的作用域。 变量的作用域有两种:全局变量和局部变量。...

  • 2023-01-12

    变量提升调用栈块级作用域作用域链和闭包 闭包 => 作用域链(词法作用域) => 调用栈(栈溢出) => 上下文...

网友评论

      本文标题:作用域/变量回收/闭包

      本文链接:https://www.haomeiwen.com/subject/xmalfqtx.html