js每日一问(4)

65 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

一。说说你对闭包的理解?闭包使用场景

是什么:

外层函数包裹内层函数,内层函数可以使用外层函数定义的变量。

使用场景:

  • 创建私有变量:外层函数内定义的变量,除了该函数及其内部函数可以调用,其他任何地方都不能调用。
  • 延长变量的生命周期:外层函数调用后,里面的定义的变量一直存在内存中。

柯里化函数:

柯里化的目的在于避免频繁调用具有相同参数函数的同时,又能够轻松的重用

// 我们可以使用闭包柯里化这个计算面积的函数
function getArea(width) {
    return height => {
        return width * height
    }
}
// 执行getArea函数,返回一个内部函数,内部函数用到了外部函数的width属性,所以width属性会一直存在内存中
const getTenWidthArea = getArea(10)
// 反复调用返回的内部方法,传递height值,计算相同宽度不同高度的面积
let area1 = getTenWidthArea(10)
let area2 = getTenWidthArea(20)
let area3 = getTenWidthArea(30)

二。说说你对作用域链的理解

作用域:变量 和 函数生效的区域。

我们一般将作用域分成:

  • 全局作用域

    • 在js中直接定义的变量,都是在全局作用域下的,全局作用域下声明的变量可以在程序的任意位置访问
  • 函数作用域

    • 在函数内部定义的变量,是函数作用域。
  • 块级作用域

    • ES6引入了letconst关键字,和var关键字不同,在大括号中使用letconst声明的变量存在于块级作用域中。

作用域链:

当在Javascript中使用一个变量的时候,首先Javascript引擎会尝试在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域。

var num1 = 100
function fun1(){
  var num2 = 200
  return function fun2(){
    var num3 = 300
    console.log(num3)
    console.log(num2)
    console.log(num1)
  }
}
fun1()()