当前位置: 首页 > news >正文

补环境基础(二) this的作用和绑定规则

一.this的定义

this指向当前代码执行的上下文对象,用于访问对象属性和方法,其值取决于调用方式而非定义位置。总的来说,this 就是函数运行时所在的环境对象。

二.this的绑定规则

2.1 默认绑定

非严格模式下this 指向 全局对象

function sayHello() {console.log(this); 
}sayHello(); 
//this指向window(浏览器环境)
//this指向global(nodejs环境)

严格模式下this 指向 undefined

'use strict';
function sayStrict() {console.log(this); // undefined
}sayStrict(); // 独立调用,严格模式 -> undefined

2.2 隐式绑定

当函数作为某个对象的属性(方法)被调用时,this 会隐式绑定到该对象上。

const user = {name: "Alice",greet: function() {console.log(`你好,我是 ${this.name}`);}
};user.greet(); // ✅ 隐式绑定 → 输出:你好,我是 Alice

2.3 显式绑定

通过调用call/apply/bind方法,强制将函数中的this绑定到指定的对象,简而言之就是改变函数运行时的this指向

2.3.1 apply和call的使用

apply:

apply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传入

改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次

call:
call方法的第一个参数也是this的指向,后面传入的是一个参数列表
跟apply一样,改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次

call和apply的简单调用

obj = {"name":"调用对象"}function test1(name,height){console.log(name,height);console.log(this)
}test1.call(obj,123,456)
test1.apply(obj,[123,456])//输出
//123 456
//{ name: '调用对象' }
//123 456
//{ name: '调用对象' }

当第一个参数为nullundefined的时候,默认指向window(在浏览器中)

fn.call(null,[1,2]); // this指向window
fn.call(undefined,[1,2]); // this指向window
2.3.2 bind的使用

bind方法和call很相似,第一参数也是this的指向,后面传入的也是一个参数列表(但是这个参数列表可以分多次传入)

改变this指向后不会立即执行,而是返回一个永久改变this指向的函数

function fn(...args){console.log(this,args);
}
let obj = {myname:"张三"
}const bindFn = fn.bind(obj); // this 也会变成传入的obj ,bind不是立即执行需要执行一次
bindFn(1,2) // this指向obj
fn(1,2) // this指向window

2.4 new绑定

new操作符调用构造函数时,构造函数内部的this,会自动指向新创建的那个对象实例

function Person(name, age) {// new 绑定:this 指向新创建的实例对象this.name = name;this.age = age;this.introduce = function() {console.log(`大家好,我是${this.name},今年${this.age}岁。`);};// 没有显式返回对象,所以自动返回新创建的实例
}// 使用 new 调用 Person,触发 new 绑定
const alice = new Person("Alice", 30);
alice.introduce(); // 输出:大家好,我是Alice,今年30岁。

参考文章:

bind、call、apply 区别

JavaScript中this的五种绑定方式详解

http://www.dtcms.com/a/291321.html

相关文章:

  • 关于Ajax的学习笔记
  • synchronized 修饰符的使用
  • (7)ROS2-MUJOCO联合仿真环境迁移优化
  • MVCC 多版本并发控制 详解
  • C语言(20250721)
  • 【PTA数据结构 | C语言版】验证六度空间理论
  • day20-sed-find
  • 【学习路线】C#企业级开发之路:从基础语法到云原生应用
  • 感知机-梯度下降法
  • 代码随想录day41dp8
  • 教资科三【信息技术】— 学科知识: 第三章(多媒体技术)
  • Java I/O模型深度解析:BIO、NIO与AIO的演进之路
  • CDN和DNS 在分布式系统中的作用
  • JAVA+AI教程-第三天
  • 数据库mysql是一个软件吗?
  • 主流 MQ 的关键性能指标
  • 瑶池数据库Data+AI驱动的全栈智能实践开放日回顾
  • 5.Java的4个权限修饰符
  • 如何用 LUKS 和 cryptsetup 为 Linux 配置加密
  • 3.4 递归函数
  • GUI简介
  • CMake变量和环境变量之间的关系和区别CMAKE_EXPORT_COMPILE_COMMANDS环境变量作用
  • Weex 知识点
  • SymPy 中抽象函数求导与具体函数代入的深度解析
  • C多线程下的fwrite与write:深入挖掘与实战指南
  • 每日算法刷题Day51:7.21:leetcode 栈6道题,用时1h40min
  • 【项目实战】——深度学习.全连接神经网络
  • PostgreSQL SysCache RelCache
  • Java API (二):从 Object 类到正则表达式的核心详解
  • DevOps是什么?