JavaScript中this的值在函数执行时确定,取决于调用方式:普通调用时指向全局对象或undefined;对象方法调用时指向该对象;call/apply/bind可显式指定;箭头函数继承外层词法作用域的this。

JavaScript 中 this 的值不是写死的,它在函数执行时才确定,且完全取决于「函数如何被调用」,而不是函数定义的位置或方式。
普通函数调用时,this 指向全局对象(非严格模式)或 undefined(严格模式)
这是最容易踩坑的场景:单独写一个函数然后直接调用,this 就会“掉”进全局或 undefined 里。
-
浏览器中非严格模式下:
this指向window - 严格模式下:
this是undefined,访问this.xxx会报TypeError - Node.js 环境中,全局对象是
globalThis,但模块顶层的this实际指向module.exports—— 这和浏览器行为不一致,容易混淆
function foo() {
console.log(this);
}
foo(); // 非严格模式 → window;严格模式 → undefined
作为对象方法调用时,this 指向该对象
这是最符合直觉的情况,也是 this 设计的初衷:让方法能自然访问所属对象的数据。
- 只看「点号左边是谁」:如果
obj.method(),this就是obj - 即使方法是从原型上继承来的,只要调用形式是
obj.method(),this仍是obj - 注意箭头函数没有自己的
this,它会沿作用域链向上找外层普通函数的this
const obj = {
name: 'Alice',
say() {
return this.name;
}
};
obj.say(); // 'Alice'
使用 call、apply、bind 时,this 由第一个参数显式指定
这三个方法是唯一能「强行改写」this 值的手段。它们的区别只在参数传递方式,对 this 的控制逻辑完全一致。
本文档主要讲述的是Python开发网站指南;HTML是网络的通用语言,一种简单、通用的全置标记语言。它允许网页制作人建立文本与图片相结合的复杂页面,这些页面可以被网上任何其他人浏览到,无论使用的是什么类型的电脑或浏览器 Python和其他程序语言一样,有自身的一套流程控制语句,而且这些语句的语法和其它程序语言类似,都有for, if ,while 类的关键字来表达程序流程。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
立即学习“Java免费学习笔记(深入)”;
-
func.call(obj, a, b):把this绑定到obj,并立即执行,参数逐个传入 -
func.apply(obj, [a, b]):同上,但参数以数组形式传入 -
func.bind(obj, a):返回一个新函数,this永久绑定为obj,参数a被预置(柯里化) - 如果传入
null或undefined,非严格模式下会被自动替换为全局对象,严格模式下就真的用null/undefined
箭头函数没有自己的 this,它继承外层词法作用域的 this
这是箭头函数和普通函数最核心的差异之一,也是 React 类组件中常用来避免 this 绑定问题的原因。
- 箭头函数内部的
this值,在定义时就固定了,跟调用方式无关 - 它不会响应
call/apply/bind的调用,这些方法传入的this参数会被忽略 - 嵌套多层箭头函数时,
this始终等于最外层第一个普通函数的this
const obj = {
name: 'Bob',
regular() {
console.log(this.name); // 'Bob'
const arrow = () => console.log(this.name); // 也输出 'Bob'
arrow();
}
};
obj.regular();
真正难的不是记住规则,而是识别「函数调用的上下文是否被意外改变」——比如把对象方法赋值给变量后再调用、事件回调、定时器、Promise 回调里丢失 this。这时候别硬扛,优先用箭头函数或 bind,比手动猜 this 指向更可靠。










