JS基础-作用域和闭包

116 阅读1分钟

什么是作用域?

  • 作用域主要分为 全局作用域、函数作用域、块级作用域
  • 全局作用域 定义的变量和函数在作用域的容易位置都可访问
  • 函数作用于定义的变量和函数只能在当前函数作用域下使用
  • 块级作用域let、const才能生效块级别作用域
  • 变量和函数在当前作用于下查询不到会向上级作用域查找, 直到找到或到全局作用域依然没找到位置

什么是闭包?

  • 作用域的特殊应用:主要有两种
  • 函数作为参数
  • 函数作为返回值

上面两个都是概念很少直接问

作用域和闭包综合题

function print(fn){
    let a = 100
    fn()
}
let a = 200
function fn(){
    console.log(a)
}
print(fn) // 打印的是多少

let b = 200
function createPrint(){
    let b = 100
    return ()=>{
        console.log(b)
    }
}
createPrint()() // 打印的是多少

两个打印的是200、100

解答: 关键名词: 自由变量

  • 自由变量: 自由变量即在当前作用域没定义的变量, 此类变量,执行时会在函数定义的作用域中, 向上级作用域查找

题中a和b都是自由变量, 在定义作用域中,向上查找, 找到的是 200、100

this在不同场景下如何取值?

  • this是在函数执行时确定的
  • 箭头函数的this取的是父级作用域的this

this是在函数执行时确定的, 自由变量是在定义的时候确定的, 这两个要区分

手写bind函数

Function.prototype.mybind = function () {
  let args = Array.from(arguments);
  let thisArg = args.shift();
  let thisFunc = this;
  
  return function () {
    newArgs = args.concat(Array.from(arguments));
    return thisFunc.apply(thisArg, newArgs);
  }
}