闭包与函数执行上下文

闭包定义

闭包是指有权访问另一个函数作用域中变量的函数,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。

闭包使用场景

  1. return返回函数(经典)
    var n = 10
    function fn(){
        var n =20
        function f() {
           n++;
           console.log(n)
         }
        return f
    }
    
    var x = fn()
    x() // 21
    x() // 22
    

  2. 循环赋值
    for(var i = 0; i<10; i++){
      (function(j){
           setTimeout(function(){
            console.log(j)
        }, 1000) 
      })(i)
    }
    

  3. 回调函数
    window.name = '林一一'
    setTimeout(function timeHandler(){
      console.log(window.name);
    }, 100)
    

  4. 节流防抖
    // 节流
    function throttle(fn, timeout) {
        let timer = null
        return function (...arg) {
            if(timer) return
            timer = setTimeout(() => {
                fn.apply(this, arg)
                timer = null
            }, timeout)
        }
    }
    
    // 防抖
    function debounce(fn, timeout){
        let timer = null
        return function(...arg){
            clearTimeout(timer)
            timer = setTimeout(() => {
                fn.apply(this, arg)
            }, timeout)
        }
    }
    

函数执行上下文

是一种对javascript代码执行环境的一种抽象概念,只要有代码运行,那么他一定是运行在执行上下文中。

每当运行代码时,就会创建执行上下文。

执行上下文分三种

  • 全局执行上下文
    • 最基础的执行上下文,所有不在函数中的代码都会在全局执行上下文中执行。一个程序中只能有一个。
  • 函数执行上下文
    • 每次调用函数时,都会为该函数创建一个执行上下文,每一个函数都有自己的执行上下文。
  • Eval函数执行上下文
    • 在eval函数中执行的代码也会有自己的执行上下文。

执行上下文的创建分为两个阶段

 作用域链

 新

创建阶段:

  1. this绑定
  2. 确定词法环境
    1. 词法环境:
      1. 环境记录器:let、const存储进去
      2. 外部环境引用:指向null
  3. 确定变量环境
    1. 用var,初始化为undefined

首先,JavaScript属于解释型语言,JavaScript的执行分为解释和执行两个阶段,这两个阶段所做的事并不一样:

解释阶段:

  • 词法分析
  • 语法分析
  • 作用域规则确定

执行阶段:

  • 创建执行上下文
  • 执行函数代码
  • 垃圾回收
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值