• 函数执行上下文


    函数执行上下文是在 JavaScript 中用来跟踪和管理函数执行的环境。每当函数被调用时,都会创建一个新的函数执行上下文,它包含了函数的参数、局部变量、以及函数在执行过程中的其他信息。

    函数执行上下文通常包括以下几个重要部分:

    1. 变量环境(Variable Environment):用来存储函数内部声明的变量,包括函数的参数和局部变量。

    2. 词法环境(Lexical Environment):类似于变量环境,但在某些情况下,它可以包含外部函数的变量,形成了作用域链。

    3. this 值:表示函数执行时的上下文对象,它在不同情况下有不同的值。

    函数执行上下文是按照调用栈的方式管理的,最近被调用的函数处于栈的顶部。当函数执行完毕时,它的执行上下文会从栈中弹出,控制权返回给调用它的函数。

    JavaScript 中的函数执行上下文中的 this 是一个特殊的关键字,它指向当前函数执行时的上下文对象。this 的值在不同情况下有不同的规则和行为,下面详细解释几种常见情况:

    1. 全局上下文中的 this

      • 在全局上下文中(在任何函数之外),this 指向全局对象(在浏览器中通常是 window 对象)。这是默认情况下的行为。
    2. 函数内部的 this

      • 在普通函数内部,this 的值取决于函数的调用方式。
      • 当函数作为全局对象的属性调用时,this 指向全局对象。
      • 当函数作为对象的方法调用时,this 指向调用该方法的对象。
      • 当使用构造函数创建对象时(使用 new 关键字),this 指向新创建的实例对象。
      • 使用 callapplybind 方法可以显式指定函数内部的 this 值。

    callapplybind 的区别和使用场景:

    区别

    • callapply 的主要区别在于参数传递方式,call 以逐个参数的形式传递,而 apply 接受一个数组参数。这意味着在一些情况下,你可能更容易使用其中一个方法,具体取决于你的数据结构和需求。
    • bind 的主要区别是它不会立即执行函数,而是返回一个新函数,你可以稍后调用。这在需要延迟执行或需要多次调用相同 this 值的情况下非常有用。
    1. 使用场景
      • 使用 callapply 通常用于临时改变函数执行上下文。例如,当你需要在一个对象上调用另一个对象的方法时,你可以使用这两种方法来确保正确的 this 上下文。
      • bind 通常用于创建带有永久性上下文绑定的函数。这在事件处理函数、定时器或任何需要保持一致 this 上下文的场景中非常有用。

    示例:

    使用 call

    const person = {
      name: 'John',
      greet: function () {
        console.log(`Hello, ${this.name}!`);
      }
    };
    
    const anotherPerson = {
      name: 'Alice'
    };
    
    person.greet.call(anotherPerson); // 输出: Hello, Alice!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    使用 bind

    const person = {
      name: 'John',
      greet: function () {
        console.log(`Hello, ${this.name}!`);
      }
    };
    
    const anotherPerson = {
      name: 'Alice'
    };
    
    const boundGreet = person.greet.bind(anotherPerson);
    boundGreet(); // 输出: Hello, Alice!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    日本知名汽车零部件公司巡礼系列之株式会社123
    Spring的事件通知
    【新品发布】洛微科技全新工业级高性能 D系列 TOF相机D3重磅上线!
    菜菜学paddle第二篇:全连接神经网络构建手写数字识别
    GO sync.Map Store、Delete 、Load 、Range等方法使用举例
    Python实现随机森林RF并对比自变量的重要性
    有关Java发送邮件信息(支持附件、html文件模板发送)
    网址在线封装APK系统源码
    【JavaScript 进阶教程】字符串新增方法 trim() 的说明与使用
    vue 使用$router.push(参数)跳转同一路由页面,参数不同,跳转页面数据均为最后一次传值数据
  • 原文地址:https://blog.csdn.net/qq_60893085/article/details/133549913