JavaScript基础之this和箭头函数详析

JavaScript基础之this和箭头函数详析

本文主要介绍JavaScript中的this关键字和箭头函数的使用方法和注意事项。

什么是this

在JavaScript中,this关键字代表当前执行上下文的对象。它的值是在函数执行时确定的,具体取决于函数的调用方式。

全局作用域下的this

在全局作用域下,this指向的是全局对象window。

console.log(this);  // Window对象

函数作用域下的this

在函数作用域下,this指向的是调用该函数的对象。

直接调用函数

如果函数被直接调用,则this指向的是全局对象window。

function test() {
  console.log(this);  // Window对象
}

test();

对象方法调用

如果函数作为对象的方法被调用,则this指向的是该对象。

let obj = {
  name: '张三',
  sayName: function() {
    console.log(this.name);  // '张三'
    console.log(this);       // obj对象
  }
}

obj.sayName();

构造函数调用

如果函数作为构造函数调用,则this指向的是新创建的对象。

function Person(name) {
  this.name = name;
  console.log(this);     // Person {name: '张三'}
}

let p = new Person('张三');

显示绑定this

除了默认绑定,this还可以通过显示绑定的方式来指定它的值。Javascript中提供了apply、call和bind三个方法来实现显示绑定。

apply方法

apply方法用于改变函数中的this指向,并将传入的参数以数组的形式传递给函数。

let obj1 = {
  name: '张三'
}

let obj2 = {
  name: '李四'
}

function sayName() {
  console.log(this.name);
}

sayName.apply(obj1);  // '张三'
sayName.apply(obj2);  // '李四'

call方法

call方法与apply类似,不同的是它接收的参数是一个一个单独传递的,而不是数组形式。

let obj1 = {
  name: '张三'
}

let obj2 = {
  name: '李四'
}

function sayName() {
  console.log(this.name);
}

sayName.call(obj1);  // '张三'
sayName.call(obj2);  // '李四'

bind方法

bind方法返回一个新的函数,它的this关键字会被永久性的绑定到传入的对象上。

let obj1 = {
  name: '张三'
}

let obj2 = {
  name: '李四'
}

function sayName() {
  console.log(this.name);
}

let sayName1 = sayName.bind(obj1);
let sayName2 = sayName.bind(obj2);

sayName1();  // '张三'
sayName2();  // '李四'

箭头函数

箭头函数是ES6中新增的一种函数声明方式。它除了语法上的差异,还具有一些特殊的行为。

箭头函数的语法

箭头函数的语法结构为:

(param1, param2, ..., paramN) => { statements }

其中,params是函数需要的参数,用逗号分隔,statements是函数体,可以包含多条语句。

箭头函数的特性

箭头函数有以下几个特性:

1. 箭头函数没有自己的this

在箭头函数中,this关键字指向的是定义时所在的对象,而不是执行时所在的对象。

let obj = {
  name: '张三',
  sayName: () => {
    console.log(this.name);    // undefined
    console.log(obj.name);     // '张三'
  }
}

obj.sayName();

2. 箭头函数不能使用arguments对象

在箭头函数中,arguments关键字会指向包含箭头函数体的函数的arguments对象,而不是箭头函数本身的arguments对象。

let test = () => {
  console.log(arguments);    // 报错
}

test(1, 2, 3);

3. 箭头函数不能作为构造函数

箭头函数没有自己的this关键字,因此不能被用作构造函数。

let Person = (name) => {
  this.name = name;    // 报错
}

let p = new Person('张三');

箭头函数的示例

示例1:箭头函数与setTimeout的使用

在setTimeout中,this指向的是全局对象window,使用箭头函数可以避免this指向的问题。

let obj = {
  name: '张三',
  sayName: function() {
    setTimeout(() => {
      console.log(this.name);    // '张三'
    }, 1000)
  }
}

obj.sayName();

示例2:箭头函数与map方法的使用

在使用map方法时,可以使用箭头函数简化代码。

let arr = [1, 2, 3, 4, 5];

let newArr = arr.map(x => x * 2);

console.log(newArr);    // [2, 4, 6, 8, 10]

总结

本文介绍了JavaScript中this关键字的使用方法和箭头函数的特性和用法,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript基础之this和箭头函数详析 - Python技术站

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

相关文章

  • 浅谈javascript中字符串String与数组Array

    浅谈JavaScript中字符串String与数组Array 1. 字符串String 字符串在JavaScript中表示一段文本,可以使用单引号 ‘ 或双引号 ” 包裹起来。例如: let str1 = ‘Hello, world!’; let str2 = "Hello, JavaScript!"; 1.1 字符串的属性和方法 1.1…

    JavaScript 2023年5月27日
    00
  • JavaScript扩展运算符的学习及应用详情(ES6)

    JavaScript 扩展运算符的学习及应用详情(ES6) 扩展运算符 (spread operator) 是 ES6 中引入的一个新的运算符。该运算符的语法是三个点(…),用于在函数调用时扩展一个数组或者在数组字面量中将一个数组展开成多个独立的元素。 扩展运算符的应用场景 数组展开 扩展运算符可以将一个数组展开成多个独立的元素,这使得数组的复制、合并等…

    JavaScript 2023年5月27日
    00
  • JS使用Date对象实时显示当前系统时间简单示例

    下面我会详细讲解如何使用 JavaScript 的 Date 对象实现实时显示当前系统时间的简单示例。 准备工作 在开始之前,我们需要了解 JavaScript 的 Date 对象,该对象用于处理日期和时间,它提供了获取当前时间、设置时间、获取时间戳等方法。 为了演示该功能,我们需要在页面中添加一个用于显示时间的元素,例如: <div id=&quot…

    JavaScript 2023年5月27日
    00
  • 基于微信小程序实现人脸数量检测的开发步骤

    下面是详细讲解基于微信小程序实现人脸数量检测的开发步骤的完整攻略。 1. 确定需求和目标 首先需要明确开发的目标,即实现人脸数量检测功能的微信小程序。同时需要明确项目的需求和功能,这里我们需要实现对用户上传的照片进行人脸数量检测,并显示检测结果。为此,我们需要调用微信小程序的API和引入相关的开发工具。 2. 引入开发工具和API 微信小程序提供了一系列AP…

    JavaScript 2023年5月19日
    00
  • JS定时器不可靠的原因及解决方案

    JS定时器不可靠的原因及解决方案 什么是JS定时器? JS中有两种类型的定时器: setTimeout setInterval 这两个函数都是用来定时执行某些代码的。setTimeout函数会在指定的时间后执行一次性的操作,而setInterval会每隔指定时间执行一次操作。 JS定时器的不可靠性 JS定时器不可靠的原因是因为定时器的执行是基于事件循环机制的…

    JavaScript 2023年5月28日
    00
  • js如何判断输入字符串长度

    JS如何判断输入字符串长度分两个方面来讲,第一个方面是字节长度,第二个方面是字符长度。 字节长度 在计算字节长度的时候,JS中一般使用Buffer.byteLength函数。 Buffer.byteLength方法 Buffer.byteLength方法的作用是用来计算一个字符串的字节长度。它的使用方法如下: const str = ‘hello world…

    JavaScript 2023年5月28日
    00
  • ES6知识点整理之String字符串新增常用方法示例

    ES6知识点整理之String字符串新增常用方法示例 1. 介绍 ES6中为字符串提供了很多实用的新增方法,包括模板字符串、startsWith()、endsWith()、repeat()、includes()等。这些方法极大地方便了字符串常用操作的实现。 2. String.raw String.raw 方法用于获取一个模板字符串的原始字符串形式,忽略所有…

    JavaScript 2023年5月28日
    00
  • 解决微信内置浏览器返回上一页强制刷新问题方法

    解决微信内置浏览器返回上一页强制刷新问题方法 问题描述 在微信内置浏览器中,当用户点击返回上一页时,页面会被强制刷新,导致页面中的一些数据丢失或者重新加载,影响用户体验。 引起问题的原因 在微信内置浏览器中,当页面的url发生变化时,微信浏览器会强制刷新页面。这种情况下,页面中所有的数据都会被重新加载,导致我们在实现页面交互时的一些问题。 解决方案 方案一:…

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