javascript的函数中this指向判断

2023-11-20

前言

最近在写 React 项目, 然后补习了下 es6 的 class 。发现 实例方法被赋值后 this 指向 undefined, 这里对 this 指向作一次总结。

一、通过 函数的 调用方式 来判断 this 指向

1. 函数名();

通过 函数名(); 方式调用函数, 则该函数中的 this 指向 global/window

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

fn(); // window

2. 对象.方法名();

通过 对象.方法名(); 方式调用函数,则该函数中的 this 指向 当前的 对象

var obj = {
	speak() {
		console.log(this); 
	}
}

obj.speak(); // obj

3. 立即执行函数

立即执行函数 中的 this 指向 global/window

	;(function() {
		console.log(this); // window
	})();

4. apply/call

通过 apply/call 方式调用函数, 则该函数中的 this 指向 与 apply/call 的第一个参数有关。

	function fn() {
		console.log(this);
	}
	var obj = {
		name: 'obj'
	}
	
	fn.apply(obj); // obj
	fn.call(obj); // obj
	fn.call(); // window
	fn.apply(null); // window

二、 3种其他情况

arrow ,bind ,call/apply 的权重
arrow > bind > call/apply

5. bind 函数

bind 创建一个新函数,并不会改变原函数

语法: fnNew = fn.bind(thisArg[, arg1[, arg2[, ...]]])
函数 fnNew 中的 this 始终指向 thisArg 对象,与函数调用方式无关


function fn () {
	console.log(this);
}
var obj = {
	name: 'obj'
};
var fnNew = fn.bind(obj);

fn(); // window
fn.call(null); // window
fnNew(); // obj
fnNew.call(null); // obj

6. arrow 函数

箭头函数 中的 this 指向 与 函数声明时候所处环境中 的 this 指向一致


var fn = () => {
	console.log(this);
}

var obj = {
	name: 'obj'
};

var fnNew = fn.bind(obj);

fn(); // window
fn.call(obj); // window
fnNew(); // window

7. class

当一个对象调用静态或原型方法时,如果该对象没有“this”值(或“this”作为布尔,字符串,数字,未定义或null) ,那么“this”值在被调用的函数内部将为 undefined。不会发生自动包装。即使我们以非严格模式编写代码,它的行为也是一样的,因为所有的函数、方法、构造函数、getters或setters都在严格模式下执行。因此如果我们没有指定this的值,this值将为undefined。

class Animal {
	static speak() {
		console.log(this);
	}
	eat() {
		console.log(this);
	}
}

var animal = new Animal();
animal.eat();  // animal
//  animal.speak();  // Uncaught TypeError: animal.speak is not a function
Animal.speak();  // Animal

let eat = animal.eat;
let speak = Animal.speak;

eat(); // undefined
speak(); // undefined

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javascript的函数中this指向判断 的相关文章

随机推荐

  • c++读取文件

    include
  • 7z命令行加密文件夹和文件名

    因为有时候需要将非常机密的东西上传到网盘 毕竟网盘也不一定安全 而每次都鼠标点添加密码很麻烦 然后就用命令行脚本弄快 电脑安装7zip 在你要压缩的文件夹打开命令行 7z a r pABC12345 mhe on test 7z a 添加f
  • 5 款最棒的 Vue 移动端 UI 组件库 - 特别针对国内使用场景推荐

    本文完整版 最棒的 Vue 移动端 UI 组件库 特别针对国内使用场景推荐 Vue 移动端 UI 组件库推荐 Vant 3 有赞移动 UI 组件库 支持 Vue 3 微信小程序 支付宝小程序 Cube UI 滴滴出行移动端 UI 库 质量可
  • 关于直流电源纹波和噪声的测量的分析和介绍

    电源纹波和噪声的定义PARD periodicand random deviation 1 电源纹波 Power Ripple 直流电压 电流中 叠加在直流稳定量上的交流分量 用电压和电流的均方根值 mVrms mArms 或峰峰值 mVp
  • 优秀LOGO的六大特质

    1 识别性 大多数的设计师认为 识别性是最容易在艺术设计和商业设计上发生冲突的地方 很多设计师都抱怨客户没有审美 喜欢平庸的LOGO设计 而一些客户认为设计师缺乏对公司和产品的理解 不懂营销 归根到底 无论设计师的设计多么创新 多么独特 始
  • 【word】错误!文档中没有指定样式的文字。 1

    问题 给文档中的图片插入题注时 报错 错误 文档中没有指定样式的文字 1 解决办法 光标定位到错误信息上 单击右键 选择 编辑域 在弹出的 域 对话框中 左侧的 域名 列表中选择 StyleRef 在右侧的 样式名 列表中选择 列表段落
  • Fabric private data入门实战

    Hyperledger Fabric private data是1 2版本引入的新特性 fabric private data是利用旁支数据库 SideDB 来保存若干个通道成员之间的私有数据 从而在通道之上又提供了一层更灵活的数据保护机制
  • VSCode中配置命令行参数

    VSCode中配置命令行参数 在跑程序调试的时候 可以直接使用脚本运行程序 这个时候调试代码只能用pdb 我觉得不太习惯 而且感觉不是很好 所以想这能不能将运行程序的脚本中的命令直接配置到vscode上 就有了这篇记录 正常vscode D
  • DHCP配置实战

    1 DHCP简介 DHCP dynamic host configuration protocol 动态的主机配置协议 基于TCP P的网络 DHCP减少了重新配置计算机IP地址的工作量 在TCP P网络中 IP地址的规划与分配是一件重要而
  • Java手写广度优先搜索和案例拓展

    Java手写广度优先搜索和案例拓展 手写必要性 手写实现广度优先搜索算法主要有以下几个必要性 理解算法原理 通过手写实现广度优先搜索算法 能够深入理解算法的原理和运行机制 这有助于我们更好地理解广度优先搜索的核心思想和优势 并能应用于解决其
  • pa皮安级电流检测电路

    1 芯片 ad8602 lmc6062 2 电路
  • Eclipse中targetlm2e-wtplweb-resources\META-1(Click for details)解决办法

    targetlm2e wtplweb resources META 1 Click for details 系统找不到指定的路径 解决办法 最近总是发现我的eclipse里面的maven项目总是报错误时不时地出现 然后我自己更新一下mave
  • Qt学习(三)—— lambda表达式

    lambda表达式 lambda 表达式是 C 11 新增的新特性 用于定义并创建匿名的函数对象 在 Qt 中配合信号一起使用 使用lambda表达式的好处在于不用定义槽函数 也不用指定信号接收者 为了使用 lambda 表达式 需要在项目
  • Flutter - okToast封装

    demo 地址 https github com iotjin jh flutter demo 使用版本 加载框 https pub flutter io cn packages oktoast readme tab oktoast 2 3
  • 【70】爬楼梯问题求解

    题目描述 思路分析 当阶数为 1 时 解法为 1 当阶数为 2 时 解法为 2 当阶数为 3 时 解法为 3 当阶数为 4 时 解法为 5 很明显可以分析出 一下公式 代码实现 递归法 class Solution public int c
  • MATLAB实现遗传算法求解n维变量函数的最小值问题

    一 问题简述 本文以遗传算法求解30维变量函数的最小值问题举例 式中 且 二 遗传算法概述 遗传算法 genetic algorithm GA 是一种仿效生物界中 物竞天择 适者生存 演化法则的进化算法 将问题参数编码为染色体 利用迭代的方
  • cv2.minAreaRect()

    功能 求出在点集下的最小面积矩形 输入 格式 points array shape n 1 2 解释 其中points是点集 数据类型为ndarray array x1 y1 x2 y2 xn yn 输出 格式 rect tuple x y
  • Centos7 安装 postgreSQL

    谷明科技 专注于大数据和人工智能领域的创新者 PostgreSQL 介绍 PostgreSQL 是一个开源且强大的关系型数据库 且具有多平台扩展能力 不同于传统的关系型数据库 例如mysql sqlserver等 PostgreSQL使用S
  • this调用本类的其他构造器

    Student类 package Java project 1 public class Student private String name private String schoolName public Student public
  • javascript的函数中this指向判断

    前言 最近在写 React 项目 然后补习了下 es6 的 class 发现 实例方法被赋值后 this 指向 undefined 这里对 this 指向作一次总结 一 通过 函数的 调用方式 来判断 this 指向 1 函数名 通过 函数