美文网首页
JavaScript学习笔记(二)作用域和闭包

JavaScript学习笔记(二)作用域和闭包

作者: 机智的akunda | 来源:发表于2020-03-15 14:22 被阅读0次

1. 作用域

作用域指的是变量存在的范围,有如下三种:

  • 全局作用域(变量在所有地方都可以读取)
  • 函数作用域(变量只在函数内部存在)
  • 块级作用域(ES6新增,需结合letconst关键字使用)

函数本身作为一个值,也有其自身的作用域。函数的作用域就是函数声明时所在的作用域,而与函数调用时的作用域无关。这一特点就导致了“闭包”现象。

2. 闭包

函数内部形成一个函数作用域,函数内部可以读取函数本身所处的作用域及上级作用域的变量,但函数外部不能访问定义在函数内部的变量:

let a = 123
function f1() {
    console.log(a)
    let b = 456
}
f1() // 123
console.log(b) // Uncaught ReferenceError: b is not defined

而闭包则提供了一种函数外部访问函数内部变量的方式,主要有两种形式:

  • 函数作为参数被传递
  • 函数作为返回值被返回
// 函数作为参数被传递
function print(func) {
    let a = 123
    func()
}
let a = 456
function f1() {
    console.log(a)
}
print(f1) // 456

// 函数作为返回值被返回
function create() {
  let b = 123
  return function() {
    console.log(b)
  }
}
let f2 = create()
let b = 456
f2() // 123

在第一个例子中,f1作为参数传递给print,在print内部调用f1并打印变量af1声明时所处的作用域是全局作用域,因此会在全局作用域中寻找变量a,故而控制台打印结果就是456

在第二个例子中,create返回一个函数,并将该函数赋值给f2并调用以打印变量b。打印变量b的函数是在create的函数作用域中声明的,因此会首先在这个函数作用域中寻找变量b,故而控制台打印结果是123

总结起来,函数内部的自由变量(变量在当前作用域未声明但却被使用,如上面例子中的变量ab)的查找,要从函数声明时所处的作用域开始,而与函数被调用时所处的作用域无关。

相关文章

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

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

  • JavaScript深入理解-闭包(Closure)

    推荐文章:学习Javascript闭包(Closure)- 阮一峰javascript深入理解-从作用域链理解闭包...

  • 学习JavaScript闭包和作用域笔记

    JS JavaScript闭包和作用域 闭包 JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外...

  • 技术栈

    一、HTML、CSS基础、JavaScript语法基础。 二、JavaScript语法进阶。包括:作用域和闭包、t...

  • 2020前端技术栈

    一、HTML、CSS基础、JavaScript语法基础。二、JavaScript语法进阶。包括:作用域和闭包、th...

  • 你不可不知道的 JavaScript 作用域和闭包

    原文出处:JavaScript Scope and Closures 作用域和闭包是 JavaScript 中重要...

  • JavaScript学习笔记(二)作用域和闭包

    1. 作用域 作用域指的是变量存在的范围,有如下三种: 全局作用域(变量在所有地方都可以读取) 函数作用域(变量只...

  • 作用域和闭包

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

  • JavaScript中的闭包

    1.什么是闭包 要理解什么是闭包,就得先理解变量的作用域。在JavaScript中,有两种作用域,全局作用域和函数...

  • javaScript门道之闭包

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

网友评论

      本文标题:JavaScript学习笔记(二)作用域和闭包

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