JS 中在严格模式下 this 的指向问题

yizhihongxing

JS 中的 this 表示函数执行时所在的上下文对象,在不同的情况下,this 指向的对象是不同的,这是 JS 中一个比较重要,也比较复杂的概念。

在严格模式下,this 指向的对象与非严格模式下不同。下面我们通过两个示例来详细讲解在严格模式下 this 的指向问题。

示例一

'use strict';

function showThis() {
  console.log(`in showThis, this is ${this}`);
}

showThis(); // TypeError: this is undefined

在函数 showThis 内部,由于是在严格模式下执行,this 并没有指向全局对象,而是 undefined,因为严格模式下,函数内部的 this 不能默认指向全局对象。

示例二

'use strict';

const person = {
  firstName: '张',
  lastName: '三',
  fullName: function() {
    console.log(`当前对象中的 this: ${this}`);
    function getName() {
      console.log(`函数中的 this: ${this}`);
      return this.firstName + this.lastName;
    }
    return getName();
  }
}

person.fullName(); // 函数中的 this: undefined
                   // Uncaught TypeError: Cannot read property 'firstName' of undefined

在函数 fullName 中调用函数 getName,其中 getName 函数是一个独立函数,它的执行环境并不是在 person 对象下。由于在严格模式下,独立函数内部的 this 不会指向全局对象,所以此时的 this 是 undefined,导致后面的 firstName 和 lastName 操作都会报错。

为了解决这个问题,我们可以使用 call、apply 或 bind 方法明确指定 this 的指向,或者使用箭头函数来绑定上下文。

'use strict';

const person = {
  firstName: '张',
  lastName: '三',
  fullName: function() {
    const _this = this;
    function getName() {
      console.log(`函数中的 this: ${this}`);
      return _this.firstName + _this.lastName;
    }
    return getName.call(_this);
  }
}

person.fullName(); // 函数中的 this: { firstName: '张', lastName: '三', fullName: [Function: fullName] }
                   // 张三

以上就是关于在严格模式下 this 的指向问题的详细说明,如果熟悉了这个概念,就可以更好地理解 JS 中的许多复杂问题了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS 中在严格模式下 this 的指向问题 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • WebGL 多重纹理的使用介绍

    请听我详细介绍“WebGL 多重纹理的使用介绍”的攻略。 简介 WebGL 多重纹理是用于在 WebGL 应用程序中使用多个纹理的技术。通过多重纹理,可以在同一对象上一次性使用多个纹理图像,并在每个图像之间进行混合或叠加。这为绘制更逼真的 3D 场景提供了更多的灵活性和可能性。 多重纹理的基本概念 在 WebGL 中,多重纹理主要涉及两个核心概念:纹理单元和…

    JavaScript 2023年6月11日
    00
  • JavaScript里四舍五入函数round用法实例

    下面是关于”JavaScript里四舍五入函数round用法实例”的攻略: 一、round函数的定义 round函数是Javascript中一个常用的数字取整函数,它可以将指定的浮点数四舍五入到整数。round函数的语法如下: Math.round(x); 其中,x为被四舍五入的数值。 round函数会根据x的小数部分进行判断,如果小数部分的值大于等于0.5…

    JavaScript 2023年6月10日
    00
  • javascript dom 基本操作小结

    Javascript DOM 基本操作小结 在编写基于Web的Javascript应用程序时,经常需要对Document Object Model(DOM)进行操作。本文将介绍DOM基本操作的相关知识,并提供一些示例。 什么是DOM? DOM是指文档对象模型(Document Object Model),用于在HTML或XML文档中表示和操作元素。DOM将整…

    JavaScript 2023年6月10日
    00
  • JavaScript学习笔记之ES6数组方法

    JavaScript学习笔记之ES6数组方法 JavaScript是一种高级编程语言,广泛应用于Web开发中,也是学习编程的一个重要工具。ES6是JavaScript的第六个版本,引入了许多新特性,其中包括一组有用的数组方法,能够大大简化数据集合的处理。本篇文章将深入介绍ES6数组方法,为读者提供完整的学习攻略。 一、ES6数组方法介绍 ES6引入的数组方法…

    JavaScript 2023年5月27日
    00
  • Vue3+Element-Plus 实现点击左侧菜单时显示不同内容组件展示在Main区域功能

    一、准备工作 首先需要创建一个基于Vue3的项目,可以使用Vue CLI来创建,并安装Element-Plus插件。具体细节可以参考Vue CLI和Element-Plus的官方文档。 二、菜单组件的实现 菜单组件采用Element-Plus自带的菜单组件el-menu,需要在菜单组件中引入需要显示的组件,并在点击菜单时将组件插入到Main区域中。 实现的大…

    JavaScript 2023年6月10日
    00
  • js实现时分秒倒计时

    JS实现时分秒倒计时 实现思路 实现时分秒倒计时的基本思路如下: 获取倒计时结束时间并转换为时间戳 获取当前时间并转换为时间戳 计算差值并转换为时分秒格式 输出倒计时结果 启动定时器,每秒钟更新一次倒计时结果 代码实现 // 获取元素 const daysEl = document.getElementById(‘days’); const hoursEl …

    JavaScript 2023年5月27日
    00
  • GoLang中Json Tag用法实例总结

    让我给您详细讲解“GoLang中Json Tag用法实例总结”的完整攻略。 什么是Json Tag 在Go语言中,如果我们需要对struct进行序列化或反序列化,需要使用encoding/json包。这个包可用性很强大,可以让我们很方便的对struct进行Json和Go语言之间的转换。而在JSON格式中,json tag就显得尤为重要。Json tag是在结…

    JavaScript 2023年5月27日
    00
  • Web Worker线程解决方案electron踩坑记录

    Web Worker线程解决方案electron踩坑记录 背景 在使用 Electron 进行开发时,我们可能会遇到 JavaScript 主线程被阻塞的情况。通常,这种问题会影响应用程序的响应性能,导致应用程序变得缓慢甚至无响应。 为了解决这种问题,我们可以使用 Web Worker 线程来将一些计算密集型任务放到后台进行处理,从而避免主线程阻塞。 Web…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部