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

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日

相关文章

  • javascript工具库代码

    让我详细讲解一下JavaScript工具库代码的完整攻略。 什么是JavaScript工具库代码? JavaScript工具库代码是已经封装好的JavaScript函数或类,它们帮助我们实现一些常见业务场景和功能,节省了开发者自行编写这些功能代码的时间和精力,提高了开发效率。 如何使用JavaScript工具库代码? 使用JavaScript工具库代码可以通…

    JavaScript 2023年5月18日
    00
  • 你了解JavaScript的js运行三部曲吗

    当浏览器加载一个包含JavaScript代码的网页时,JavaScript代码的执行流程一般会遵循以下三个步骤: 1. 解析代码 浏览器首先会将包含JavaScript代码的网页进行解析,在这个过程中,会对JavaScript代码进行词法分析和语法分析。 词法分析:JavaScript代码中包含了各种不同类型的词汇单元,例如关键字、标识符、操作符等等,词法分…

    JavaScript 2023年5月18日
    00
  • 如何用JS/HTML将时间戳转换为“xx天前”的形式

    将时间戳转换为类似“xx天前”的形式是一个常见的需求。下面我来详细讲解如何用JS/HTML实现这个功能。 第一步:获取当前时间戳和目标时间戳 JavaScript内置了一个用于获取当前时间戳的方法,即: var now = Date.now(); 如果要将一个日期字符串转换为时间戳,可使用Date.parse方法,例如: var target = Date.…

    JavaScript 2023年5月27日
    00
  • Vue实现浏览器端扫码功能

    下面是Vue实现浏览器端扫码功能的完整攻略: 1. 使用第三方库实现扫码 使用第三方库是最简单的实现方式之一。可以使用ZXing-js库,它提供了 JavaScript 代码中解码和编码二维码和条形码的功能。 步骤 安装ZXing-js: bash npm install @zxing/library 在 Vue 应用中引入 ZXing-js: javasc…

    JavaScript 2023年6月11日
    00
  • js实现让某个动作延迟几秒执行

    实现动作延迟执行可以通过JavaScript语言中提供的setTimeout()函数来实现。 该函数的语法为: setTimeout(function, delay) 其中“function”参数是需要执行的函数名或函数体,delay参数是延迟的时间,单位是毫秒。 下面给出两个示例来讲解该函数如何实现动作延迟执行: 示例一:实现3秒钟后弹窗提示 可以使用以下…

    JavaScript 2023年6月11日
    00
  • JS中FormData类实现文件上传

    当需要上传文件时,可以使用JS中的FormData类来实现。下面是实现文件上传的完整攻略: 创建一个表单 首先,要在HTML中创建一个表单,指定具体的上传文件的路径和上传方法: <form action="upload.php" method="post" enctype="multipart/form…

    JavaScript 2023年5月27日
    00
  • 全面了解JavaScirpt 的垃圾(garbage collection)回收机制

    下面是关于JavaScript垃圾回收机制的详细攻略。 1. 简介 JavaScript是一种解释型语言,在执行代码时,需要将代码转换成机器语言再进行执行。这使得JavaScript非常灵活,但与此同时,也使得程序的开销变得非常昂贵。 为了解决这个问题,JavaScript引入了垃圾回收机制。垃圾回收机制的作用是自动地清除不再使用的内存空间,以解决内存泄漏问…

    JavaScript 2023年6月11日
    00
  • 高效利用Angular中内置服务$http、$location等

    让我来详细讲解一下“高效利用Angular中内置服务$http、$location等”的攻略。 $http服务 在AngularJS中,$http是一个内置服务,用于在Angular应用程序中发起HTTP请求。该服务使用 AJAX 核心技术来完成HTTP请求,并支持 GET、POST、PUT等请求方法。使用$http服务可以很方便地向Web服务器发起请求,获…

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