美文网首页
函数(三)闭包和作用域

函数(三)闭包和作用域

作者: 水明 | 来源:发表于2018-09-25 00:59 被阅读1次

本文对应《JavaScript忍者秘籍》第5章内容。

1.理解闭包

闭包允许函数访问并操作函数外部的变量,只要变量或函数存在于声明函数是的作用域内。
来看一个简单的闭包:

var air='air';
var inTheHouse=()=>console.log('breathe '+air);
inTheHouse();//breathe air

现在我们去美国呼吸香甜的空气:

var breathe;
var sweetAir=()=>{
  var air='American air';
  breathe=()=>console.log('breathe '+air);
};
sweetAir();
breathe();//breathe American air

乍一看,当breathe()执行时,air所在的作用域已经消失,为什么还能访问到内部变量呢?
当在外部函数中声明内部函数时,不仅定义了函数的声明,还创建了一个闭包。闭包包括函数的声明,和函数声明时该作用域中的所有变量。当内部函数执行时,声明时的作用域消失,但通过闭包仍可访问原始的作用域。这样我们就呼吸到了香甜空气了。
存储闭包将影响性能,勿滥用闭包。

2.应用闭包

封装私有变量

原生JavaScript不支持私有变量。我们可以创建类似其他语言内的私有变量,使他们对外部隐藏。

function Guess(){
  var ans=Math.floor(Math.random()*100);
  this.ask=(x)=>{
    if(x<ans){
      return "too small";
    }
    else if(x>ans){
      return "too large";
    }
    else if(x===ans){
      return "right!";
    }
    else{
      return "无可奉告";
    }
  };
};

ans在闭包内部可以被ask访问,在闭包外部不可访问。

回调函数

回调函数指需要在将来不确定的某一时刻异步调用的函数。
通常在回调函数中需要频繁访问外部数据。

3.通过执行上下文来跟踪代码

4.使用词法环境跟踪变量的作用域

相关文章

  • 作用域和闭包

    目录 概述 作用域编译过程词法作用域全局作用域函数作用域 闭包循环和闭包闭包的用途性能 总结 概述 作用域和闭包一...

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

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

  • 14.JS基础之作用域与闭包

    作用域: 全局作用域 函数作用域 块级作用域(ES6新增) 常见的闭包有:作为函数返回值的闭包与作为函数参数的闭包...

  • 作用域、作用域链、闭包、面向对象、执行上下文

    作用域 作用域链 函数的提前声明 闭包 JavaScript 闭包与类(原型链)之间的开发方式 构造函数和普通函数...

  • 2018-01-07 关于javascript闭包和作用域的理解

    关于 javascript 闭包的一些思考 作用域 词法作用域 函数作用域 块作用域 闭包 什么是作用域? 作用域...

  • 如何理解闭包?

    1、定义: 嵌套在函数作用域中的函数,称为闭包函数。该作用域称为闭包环境。通过闭包函数可以访问闭包函数所在函数作用...

  • 所谓闭包

    所谓闭包 Closures (闭包)是使用被作用域封闭的变量,函数,闭包等执行的一个函数的作用域。通常我们用和其相...

  • python基础-08-内置函数、作用域、闭包、递归

    python基础-内置函数、作用域、闭包、递归 1.常见的内置函数 2.函数内变量的作用域 3.内嵌函数和闭包 4...

  • js闭包的理解

    什么是闭包 通俗的来讲,个人觉得闭包就是延长变量作用域的函数。众所周知js的作用域分为全局作用域和链式作用域。在函...

  • JavaScript中的闭包

    理解闭包,首先必须理解变量作用域。前面提到,JavaScript 有两种作用域:全局作用域和函数作用域。函数内部可...

网友评论

      本文标题:函数(三)闭包和作用域

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