首页 > 其他分享 >一文讲透箭头函数和This

一文讲透箭头函数和This

时间:2024-07-07 12:58:08浏览次数:14  
标签:console 函数 name 箭头 log const 讲透 一文

目录

前言

在JavaScript中,this是理解函数上下文的关键。本文将深入剖析this的奥秘,揭示其在不同场景下的行为,文章最后会给出几道面试题,测试你的掌握能力。

环境说明准备

环境,我们就Node 环境,来讲我们下面的代码 大家可以直接用 node file 或者 nodemon file 来运行代码,推荐使用nodemon 避免重复启动, 如果还没有,可以使用下面命令进行安装

npm i -g nodemon

干货开始

node中this的坑

结论: node中的 thisglobalThis 并不是同一个 对象 , node 中的 this 指向的是 module.exports

globalThis 是一个全局对象,它在所有 JavaScript 环境中都可用,用于引用全局作用域。在不同的 JavaScript 环境中,全局对象可能有不同的名称,例如:

  • 在浏览器中,全局对象是 window
  • 在 Node.js 中,全局对象是 global
  • 在 Web Workers 中,全局对象是 self
console.log('全局this: ',this);
console.log('this 等于 module.exports :', this === module.exports);
console.log('全局globalThis:', globalThis);

在这里插入图片描述

this常用场景

全局中的this

console.log(this); //{}
this.num = 10;
console.log(this.num); //10
console.log(globalThis.num); //undefined

函数中的this

function fn(){
  this.num = 10;
}
//执行函数
fn();
console.log(this); // {}
console.log(this.num); //undefined
console.log(globalThis.num); //10

构造函数中的this


function Fn(){
  this.num = 998;
}
let fn = new Fn();
console.log(fn.num); //998
console.log(globalThis.num); //undefined

改变this的三种方式

this 关键字在 JavaScript 中用于指向函数执行的上下文对象。改变 this 的值通常使用 callapplybind 这三个方法。

  1. call()

    • 立即调用函数。
    • 接受参数列表,参数逐个传递。
  2. apply()

    • 立即调用函数。
    • 接受一个参数数组。
  3. bind()

    • 不立即调用函数,而是返回一个新的函数。
    • 可以预先设定参数。
特性call()apply()bind()
调用方式立即调用立即调用返回新函数
参数传递逐个传递数组形式传递可以预设参数
返回值函数的返回值函数的返回值新函数引用
用法示例func.call(obj, arg1, arg2)func.apply(obj, [arg1, arg2])const newFunc = func.bind(obj, arg1, arg2)

箭头函数

箭头函数是ECMAScript 6(ES6)中引入的一种新的函数定义方式,它提供了一种更简洁的语法来编写函数。主要有以下几个特点:

  1. 简洁的语法:箭头函数的语法比传统的函数表达式更简洁,不需要使用 function 关键字。

  2. 没有独立的 this:箭头函数没有自己的 this 上下文,它会捕获其所在上下文的 this 值,作为自己的 this

  3. 没有 arguments 对象:箭头函数中没有 arguments 对象,如果需要访问函数的参数,可以使用剩余参数(rest parameters)语法。

  4. 不可以使用 yield 关键字:箭头函数不能用作生成器(generator)函数,即不能使用 yield 关键字。

  5. 隐式返回:当箭头函数的函数体只有单个表达式时,可以省略花括号和 return 关键字,表达式的结果将被隐式返回。

// 传统函数表达式
var traditionalFunc = function(x) {
    return x * 2;
};

// 箭头函数
const arrowFunc = (x) => x * 2;

// 隐式返回的箭头函数
const double = x => x * 2;

// 使用剩余参数的箭头函数
const sum = (...numbers) => numbers.reduce((acc, current) => acc + current, 0);

// 没有参数的箭头函数
const sayHello = () => console.log("Hello!");

// 使用对象字面量的箭头函数
const getPerson = () => ({ name: "Alice", age: 25 });

箭头函数 This

结论

  1. 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
  2. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
  3. this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this

代码示例

对象箭头函数

let bob1 = {
    _name: "Bob",
    printFriends:() => {
    //箭头函数根本没有自己的this,导致内部的this就是外层代码块的this
        console.log(this); // {}
    }
}
console.log(bob1.printFriends());

// 外部对象this的改变 ,感觉this被改变了,但是记住它是没有this的
let friends = ['jack']
let bob = {
    _name: "Bob",
    printFriends() {
        let that = this
        friends.forEach(f => {
            console.log(this === that,'that');
            console.log('is bob?',this === bob,);
            console.log('is globalThis?',this === globalThis,);
            console.log(this + " knows " + f)
        });
    }
};
console.log(bob.printFriends());
console.log('-----');
let printFriends = bob.printFriends
console.log(printFriends());

在这里插入图片描述
请问下面的代码之中有几个this?

function foo() {
  return () => {
    return () => {
      return () => {
        console.log('id:', this.id);
      };
    };
  };
}
var f = foo.call({id: 1});
var t1 = f.call({id: 2})()(); // id: 1
var t2 = f().call({id: 3})(); // id: 1
var t3 = f()().call({id: 4}); // id: 1

面试题测试:

答案我在放评论区,鼓励你先在评论区写下答案在进行核对

  1. 题目: 以下函数调用中,this 指向什么?

    function test() {
        return this;
    }
    const obj = {
        test: test
    };
    console.log(test()); // ?
    console.log(obj.test()); // ?
    
  2. 题目: 使用 call 方法改变 this 的指向,并调用函数。

    function sayName() {
        console.log("Name: " + this.name);
    }
    const person = { name: "John" };
    sayName.call(person); // ?
    
  3. 题目: 使用 apply 方法实现与 call 相同的效果。

    function sayAge(age) {
        console.log("Age: " + this.age);
    }
    const person = { age: 30 };
    sayAge.apply(person, [30]); // ?
    
  4. 题目: 使用 bind 方法创建一个新函数,其 this 指向特定对象。

    function greet(greeting) {
        console.log(greeting + ", " + this.user);
    }
    const user = { user: "Jane" };
    const boundGreet = greet.bind(user, "Hello");
    boundGreet(); // ?
    
  5. 题目: 箭头函数中的 this 是如何工作的?

    const obj = {
        name: "Alice",
        greet: () => {
            setTimeout(() => {
                console.log("Hi, " + this.name);
            }, 1000);
        }
    };
    obj.greet(); // ?
    
  6. 题目: 构造函数中的 this 是如何工作的?

    function Person(name) {
        this.name = name;
        this.greet = function() {
            console.log("Hello, " + this.name);
        };
    }
    const person = new Person("Bob");
    person.greet(); // ?
    

标签:console,函数,name,箭头,log,const,讲透,一文
From: https://blog.csdn.net/cdns_1/article/details/140244151

相关文章

  • 一文理解 Treelite,Treelite 为决策树集成模型的部署和推理提供了高效、灵活的解决方案
    ......
  • 【汽车故障诊断3】一文了解诊断故障码DTC状态位
    在上篇 【汽车故障诊断2】一文了解诊断故障码DTC介绍DTC的基本概念,本篇文章将继续介绍DTC的其他信息:DTC状态位。1什么是DTC状态位  DTC状态位,即StatusOfDTC,是用来指示DTC所对应的故障是否发生,是否被确认等状态。DTC状态位包含1个字节数据长度,每一位都有具体的定义,如下......
  • 一文带你了解乐观锁和悲观锁的本质区别!
    文章目录悲观锁是什么?乐观锁是什么?如何实现乐观锁?什么是CAS应用局限性ABA问题是什么?悲观锁是什么?悲观锁它总是假设最坏的情况,它会认为共享资源在每次被访问的时候就会出现线程安全问题,所以每次在获取资源的时候都会上锁,以避免线程安全问题发生。也就是说,共享资源每......
  • 通信协议 | 一文搞懂SPI通信协议
    SPI的英文全称为SerialPeripheralInterface,顾名思义为串行外设接口。SPI是一种同步串行通信接口规范,主要应用于嵌入式系统中的短距离通信。该接口由摩托罗拉在20世纪80年代中期开发,后发展成了行业规范。SPI是一种高速的、全双工的、同步的通信总线,并且至多仅需使用......
  • 一文速览计算机发展史
    起源:计算机的起源可以追溯到古代的计算工具,如算盘、机械计算器等。然而,真正意义上的现代计算机,其起源和发展历史却始于二十世纪中叶。在此之前,人们主要使用的是手动计算或简单的机械计算器来进行计算。1937年,美国数学家冯·诺依曼提出的“存储程序”的概念,这一想法奠定了......
  • python - [12] 脚本一文通
    题记部分 一、文件夹&文件(1)删除空文件夹#删除目录中的空文件夹importosdefmove_epty_folders(directory_path):forroot,dirs,filesinos.walk(directory_path,topdown=False):forfolderindirs:folder_path=os.path.join(root,f......
  • 一文搞懂到底什么是 AQS
    前言日常开发中,我们经常使用锁或者其他同步器来控制并发,那么它们的基础框架是什么呢?如何实现的同步功能呢?本文将详细讲解构建锁和同步器的基础框架--AQS,并根据源码分析其原理。一、什么是AQS?1.AQS简介AQS(AbstractQueuedSynchronizer),抽象队列同步器,它是用来构建锁或其他......
  • 一文带你入门机器学习分类算法
    专栏介绍1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。3.需要强调的是,专栏仅介绍主流、......
  • 【AppStore】一文让你学会IOS应用上架Appstore
    前言咱们国内现在手机分为两类,Android手机与苹果手机,现在用的各类APP,为了手机的使用安全,避免下载到病毒软件,官方都极力推荐使用手机自带的应用商城进行下载,但是国内Android手机品类众多,手机商城各式各样,做不到统一,所以Android的APP上架得一个一个平台去申请上架,一直让开发人员头......
  • 一文带你看懂什么是营销归因模型及SaaS企业的应用
    在数字化时代,营销活动的多样性和复杂性使得评估其效果成为一项挑战。营销归因模型应运而生,为SaaS企业等提供了科学、系统的评估工具。本文将简要介绍什么是营销归因模型,阐述其带来的好处,并探讨SaaS企业可以采用的营销归因系统。什么是营销归因模型?营销归因模型是一种方法论,......