js改变this指向

1. 使用call()apply()方法

call()apply()方法都可以用来调用一个函数,并显式地设置this的值。它们之间的主要区别是call()方法接受一个参数列表,而apply()方法接受一个包含多个参数的数组。

复制代码
function greet(greeting, punctuation) {  
  console.log(greeting + ', ' + this.name + punctuation);  
}  
  
const person = {  
  name: 'John'  
};  
  
// 使用call  
greet.call(person, 'Hello', '!');  
// 输出: Hello, John!  
  
// 使用apply  
greet.apply(person, ['Hi', '.']);  
// 输出: Hi, John.

2. 使用箭头函数

箭头函数不绑定自己的this,它会捕获其所在上下文的this值作为自己的this值,并且这个绑定在函数创建时就完成了。

复制代码
const person = {  
  name: 'Jane',  
  greet: function() {  
    setTimeout(() => {  
      console.log(this.name); // this指向person对象  
    }, 1000);  
  }  
};  
  
person.greet(); // 输出: Jane

3. 使用bind()方法

bind()方法会创建一个新的函数,在bind()被调用时,这个新函数的this被指定为bind()的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

复制代码
function greet(greeting, punctuation) {  
  console.log(greeting + ', ' + this.name + punctuation);  
}  
  
const person = {  
  name: 'Doe'  
};  
  
const greetDoe = greet.bind(person, 'Howdy', '!');  
greetDoe(); // 输出: Howdy, Doe!

4. 在构造函数中使用new关键字

当使用new关键字调用构造函数时,this会被绑定到新创建的对象上。

复制代码
function Person(name) {  
  this.name = name;  
  this.greet = function() {  
    console.log('Hello, ' + this.name);  
  };  
}  
  
const person = new Person('Alice');  
person.greet(); // 输出: Hello, Alice
相关推荐
IT_陈寒2 分钟前
Python装饰器竟然偷偷改了函数名?这个坑我爬了三天
前端·人工智能·后端
free3534 分钟前
作用域链与 Environment:变量查找、遮蔽和赋值怎么实现
javascript
cookies_s_s40 分钟前
C++ 字符串动态创建对象 -- 工厂模式、自动注册、模板递归动态调用
服务器·开发语言·c++
Momo__44 分钟前
Vite 8.1 打包开发模式——10000 组件冷启动 15 倍,"No Bundle Dev" 七年后被自己终结
前端·vue.js·vite
YHL1 小时前
🤖 Agent 智能体开发实战 · 第一课:Tool Use —— 让大模型自动干活
前端·javascript·人工智能
Monki1 小时前
AI 规范式 UI 设计,一键批量出页,高效落地不翻车
前端
山河木马1 小时前
渲染管线-计算得到gl_FragColor(片元着色器)之后续GPU流程
前端·webgl·计算机图形学
不想说话的麋鹿1 小时前
「项目实战」我用 Codex + GPT-5.5 + Trellis "氛围编程",独立做了一个情侣厨房小程序
前端·agent·全栈
盐焗鹌鹑蛋2 小时前
【C++】继承
开发语言·c++
接着奏乐接着舞。2 小时前
【2026年7月最新】69道RAG面试题
前端·人工智能·后端·aigc·embedding·rag