JavaScript中this指针学习整理

JavaScript中this指针学习整理

1.以普通函数调用时

非严格模式下 this指向window

在这里插入图片描述

在这里插入图片描述

严格模式下 undefined

在这里插入图片描述

在这里插入图片描述

2.以方法形式调用时,this就是调用方法的对象

在这里插入图片描述

在这里插入图片描述

3.以构造函数的形式调用时,this是新创建的对象

在这里插入图片描述

在这里插入图片描述

4.call()、apply()调用 改变this指向

语法:

func.call([thisArg[, arg1, arg2, …argN]])

func.apply(thisArg, [argsArray])

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

call()、apply()方法可以从一个对象使用另一个对象方法,不必重写

5.箭头函数调用

在这里插入图片描述

在这里插入图片描述

因为 => 函数没有自己this,而是上下文中的this,也可以理解为上一级中的this

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.bind()方法绑定this

语法:let boundFunc = func.bind(thisArg[,arg1[,arg2[,…argN]]])

在这里插入图片描述

<think>好的,我需要回答用户关于C++和JavaScriptthis指针和that指针用法的问题。首先,我需要明确用户的问题重点。用户提到了“this指针和that指针的用法”,但根据我的知识,在C++和JavaScript中主要使用this关键字,而“that指针”可能是指在某些情况下为了保留this而创建的别名,比如在JavaScript闭包中常见到var that = this;这样的写法。因此,我需要先确认用户的问题是否涉及这两种语言中的this以及常见的that别名用法。 接下来,我需要整理C++中this指针的基本概念和用法。C++中的this是一个指向当前对象的指针,隐式存在于成员函数中,用于区分成员变量和局部变量,以及链式调用。需要举例说明,比如在构造函数或成员函数中使用this->x来访问成员变量。 然后是JavaScript中的this关键字,它的行为与C++不同,取决于函数的调用方式。需要解释默认绑定、隐式绑定、显式绑定(call, apply, bind)、new绑定以及箭头函数中的this。同时,要提到在闭包或嵌套函数中,为了保持外层this的引用,常用var that = this;或const that = this;的做法。这里需要举一个例子,比如在事件处理函数中,内部函数可能丢失this,因此用that来保存。 接着,我需要比较C++和JavaScriptthis的差异。C++的this是静态绑定的,编译时确定,而JavaScript是动态绑定的,运行时确定。此外,JavaScript中的this可以灵活改变,而C++的this是固定指向当前实例的指针。 然后,根据用户提供的引用,检查是否有相关的内容可以引用。用户提供的引用中有关于C++代码编译为WebAssembly的例子(引用[1]),结构体定义(引用[2]),代码格式化(引用[3]),以及WebRTC编译(引用[4]),这些似乎与this和that指针没有直接关联。但可能需要确认是否有其他隐含的联系,比如结构体中的方法是否涉及this,但引用[2]是Rust的结构体示例,所以可能不适用。因此,用户提供的引用可能对当前问题帮助不大,但需要确保回答正确,不引用不相关的内容。 接下来,生成相关问题部分,需要考虑用户可能进一步询问的内容,比如常见错误、如何绑定this、不同语言中的区别、箭头函数的影响等。 最后,确保回答结构清晰,分点说明,代码示例正确,并正确使用LaTeX格式,比如变量用$...$包裹,独立公式用$$...$$,但在这个问题中可能不需要数学公式,所以主要注意代码块的格式和正确性。 总结步骤: 1. 解释C++中的this指针,包括用途和示例。 2. 解释JavaScript中的this关键字,不同绑定方式和示例。 3. 介绍JavaScript中使用that作为this别名的常见做法及示例。 4. 比较两种语言中this的差异。 5. 生成相关问题,帮助用户深入理解。</think>在C++和JavaScript中,`this`指针/关键字的行为差异显著,而`that`指针是开发者为了解决作用域问题创造的临时变量。以下是详细解析: --- ### 一、C++中的`this`指针 #### 1. 基本概念 - **指针类型**:`this`是**指向当前对象的指针**,隐式存在于所有非静态成员函数中。 - **作用**: - 区分成员变量与局部变量:例如在构造函数`Point(int x, int y) { this->x = x; this->y = y; }`中[^2]。 - 支持链式调用:通过返回`*this`实现,如`obj.setX(1).setY(2)`。 - 在运算符重载中明确操作对象:如`Complex operator+(const Complex& other) { return Complex(this->real + other.real, ...); }`。 #### 2. 代码示例 ```cpp class Circle { private: double radius; public: void setRadius(double radius) { this->radius = radius; // 明确成员变量 } Circle& scale(double factor) { radius *= factor; return *this; // 链式调用 } }; ``` --- ### 二、JavaScript中的`this`关键字 #### 1. 动态绑定规则 - **默认绑定**:全局对象(非严格模式)或`undefined`(严格模式)。 ```javascript function show() { console.log(this); } show(); // 浏览器中输出Window对象 ``` - **隐式绑定**:通过对象调用时,`this`指向该对象。 ```javascript const obj = { name: "test", log() { console.log(this.name); } }; obj.log(); // 输出"test" ``` - **显式绑定**:通过`call`/`apply`/`bind`强制指定`this`。 ```javascript function greet() { console.log(this.name); } greet.call({ name: "Alice" }); // 输出"Alice" ``` - **new绑定**:构造函数中`this`指向新创建的实例。 ```javascript function Person(name) { this.name = name; } const p = new Person("Bob"); ``` - **箭头函数**:继承外层作用域的`this`,无法通过上述规则修改。 ```javascript const obj = { run: () => { console.log(this); } // 此处this指向外层(如Window) }; ``` #### 2. `that`指针的用途 在嵌套函数或闭包中,通过`const that = this`保留外部函数的`this`引用: ```javascript class Timer { constructor() { this.seconds = 0; const that = this; setInterval(function() { that.seconds++; // 使用that替代this }, 1000); } } // 或使用箭头函数替代: setInterval(() => { this.seconds++; }, 1000); ``` --- ### 三、C++与JavaScript的关键差异 | 特性 | C++ | JavaScript | |---------------------|----------------------------------|---------------------------------| | **绑定时机** | 编译时确定(静态绑定) | 运行时确定(动态绑定) | | **修改方式** | 不可修改(始终指向当前对象) | 可通过`call`/`apply`/`bind`修改 | | **箭头函数等效行为** | 无 | 通过`that=this`或箭头函数实现 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值