精通JavaScript的this关键字

如何精通 JavaScript 的 this 关键字?

了解上下文

this 关键字的值取决于函数被调用时的上下文。在 JavaScript 中,上下文默认是全局对象,但在函数中,上下文可能会被更改。为了更好地了解 this 关键字,我们需要了解上下文是如何被定义和更改的。

示例一:默认上下文是全局对象,设置 this 的方式是使用函数调用绑定。

function logThis() {
  console.log(this); //默认情况下,this 指向全局对象
}

logThis(); // 输出:Window { ... }

示例二:通过对象调用函数,将函数绑定到该对象上,从而修改 this 的上下文。

const obj = {
  name: 'Hannah',
  logName() {
    console.log(this.name); // 此时,this 的上下文设置成了 obj 对象,输出:Hannah
  }
};

obj.logName();

理解 this 的四种绑定规则

当 this 作为函数的参数进行调用时,它的绑定方式可以分为四种情况。

  1. 默认绑定 - 当前上下文是全局对象或 undefined。
function logThis() {
  console.log(this); //默认情况下,this 指向全局对象
}

logThis(); // 输出:Window { ... }
  1. 隐式绑定 - 当前上下文是对象字面量或属性访问。
const obj = {
  name: 'Hannah',
  logName() {
    console.log(this.name); // this 被隐式绑定为 obj, 输出: Hannah
  }
};

obj.logName();
  1. 显式绑定 - apply 和 call 方法用来手动绑定 this 到函数中。
function logThis() {
  console.log(this);
}

const obj = { name: 'Hannah'};
logThis.call(obj); // 输出:{ name: 'Hannah' }
  1. new 绑定 - this 绑定到由构造函数新创建的对象。
function Person(name) {
  this.name = name;
}

const hannah = new Person('Hannah');
console.log(hannah.name); // 输出:Hannah

当 this 的值为 undefined

当 this 的值为 undefined 或 null 时,它会被默认绑定为全局对象。但在严格模式下, this 的值将保持 undefined。

function logThis() {
  console.log(this);
}

logThis.call(null); // 输出:Window { ... } 或者 undefined

箭头函数绑定 this

箭头函数的 this 值由上层作用域来决定。箭头函数没有自己的 this 值,它们继承父级作用域中的 this 值。

const obj = {
  name: 'Hannah',
  logName() {
    const f = () => {
      console.log(this.name); // this 继承自 obj, 输出: Hannah
    };

    f();
  }
};

obj.logName();

在学习 JavaScript 的 this 关键字时,这些知识点是必备的。通过理解上下文和绑定规则,我们可以更好地使用它,并避免出现无意中绑定 this 的错误。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:精通JavaScript的this关键字 - Python技术站

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

相关文章

  • javascript学习笔记(十五) js间歇调用和超时调用

    JavaScript学习笔记(十五)—— JS间歇调用和超时调用 JavaScript中的间歇调用和超时调用是处理异步编程中的常用技术,它们可以让我们在指定的时间间隔内执行指定的函数或代码块。接下来我们将详细讲解 JavaScript中的间歇调用和超时调用。 1. setInterval方法 setInterval方法可以按照指定时间间隔重复执行指定的函数或…

    JavaScript 2023年5月27日
    00
  • 一文了解ES5和ES6的区别

    一文了解ES5和ES6的区别 Javascript是世界上最流行的编程语言之一,它一直在不断发展和更新。ES5和ES6是Javascript的两个主要版本,它们之间存在很多重要的区别。本文将详细讲解ES5和ES6的区别,以便更好地理解现代的Javascript编程。 1. 变量声明的关键字不同 在ES5中,使用var关键字声明变量。例如: var x = 1…

    JavaScript 2023年6月10日
    00
  • JavaScript 中使用SpreadJS导入和导出 Excel 文件的方法

    下面是详细的攻略。 JavaScript 中使用 SpreadJS 导入和导出 Excel 文件的方法 SpreadJS 是一款基于 JavaScript 的电子表格组件,支持 Excel 的导入和导出功能。本文将介绍如何使用 SpreadJS 的 API 对 Excel 文件进行导入和导出操作。 导入 Excel 文件 使用 SpreadJS 的 API …

    JavaScript 2023年6月11日
    00
  • JavaScript前后端JSON使用方法教程

    以下是”JavaScript前后端JSON使用方法教程”的完整攻略: 前言 在Web开发中,JSON是一个重要的数据交换格式。在JavaScript中,我们经常需要使用JSON来进行数据解析、数据交换、以及与后端交互等操作。因此,本篇文章主要介绍了JavaScript前后端JSON使用方法。 JavaScript读取JSON数据 JavaScript提供了p…

    JavaScript 2023年5月27日
    00
  • js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)

    当我们需要将时间戳转换为特定格式的日期时间字符串时,我们可以使用 JavaScript 中内置的 Date 对象来进行处理,然后使用字符串模板 (template string)即可实现。以下是将时间戳转换为 yyyy-MM-dd hh:mm 格式的完整攻略。 1. 创建 Date 实例 首先,我们需要通过 Date() 构造函数创建一个 Date 实例,构…

    JavaScript 2023年5月27日
    00
  • 详解js静态检查工具eslint配置文件

    这里是详解js静态检查工具eslint配置文件的完整攻略: 一、什么是eslint? ESLint 是一种静态检查工具,可以用于检查 JavaScript 代码中的潜在问题。事实上,ESLint 是最流行的 JavaScript 静态检查工具之一。 二、eslint 配置文件 为了让 ESLint 对某些代码或规则进行特殊处理,我们需要在项目中添加一个配置文…

    JavaScript 2023年5月27日
    00
  • 异步安全加载javascript文件的方法

    异步安全加载JavaScript文件是指在保证网页性能和用户体验的同时,确保JavaScript代码能够无误地执行。下面是异步安全加载JavaScript文件的方法: 1. 异步加载JavaScript文件 异步加载JavaScript文件可以使用HTML5中的script标签,并且设置async属性。这样浏览器会异步加载脚本,不会阻塞网页的渲染,同时脚本在…

    JavaScript 2023年5月27日
    00
  • JavaScript使用闭包模仿块级作用域操作示例

    JavaScript使用闭包模拟块级作用域操作的示例可能是一个新主题。在这里提供一个完整的攻略,包括定义和用法,以及一个具体示例。 什么是闭包 JavaScript中的闭包是一种函数,它可以访问自身作用域之外的变量。实际上,函数创建了一个内部作用域和一个变量对象。这个变量对象包含所有的局部变量,参数等,而且变量对象是由函数的作用域链所确定的。因此,通过访问该…

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