在JavaScript里,this的指向并不是在写代码时固定的,而是在函数被调用时根据执行上下文来决定的。当我们在对象方法中使用回调函数,或者把方法当作参数传递时,原本的this往往会指向全局对象或undefined,这就导致我们无法直接访问外层对象的数据。为了绕开这个问题,开发者很早就开始用 var _this = this 的方式把外层this存起来。

this的四种绑定规则
理解_this之前,必须先清楚this是怎么绑定的。通常分为以下情况:
- 默认绑定:独立函数调用,非严格模式下this指向window。
- 隐式绑定:作为对象方法调用,this指向该对象。
- 显式绑定:通过call、apply、bind强制指定this。
- new绑定:构造函数调用时this指向新实例。
为什么需要_this
看一个常见场景,在构造函数里使用定时器:
function User(name) {
this.name = name;
var _this = this; // 保存外层this
setTimeout(function() {
// 这里的this是window,不能直接用this.name
console.log(_this.name);
}, 1000);
}
var u = new User('张三');
上面代码中,定时器里的匿名函数独立调用,this已经丢失了User实例。通过 var _this = this 把外层this存下来,就能在回调里继续访问实例属性。
_this的命名习惯
除了_this,也有人写self、that,本质都是创建一个闭包变量保存原this。这是一种兼容性好、容易理解的写法。
现代替代方案
使用bind显式绑定
function User(name) {
this.name = name;
setTimeout(function() {
console.log(this.name);
}.bind(this), 1000);
}
使用箭头函数
箭头函数没有自己的this,它会继承外层词法作用域的this,因此不需要_this:
function User(name) {
this.name = name;
setTimeout(() => {
console.log(this.name);
}, 1000);
}
不同方案对比
| 方案 | 兼容性 | 可读性 |
|---|---|---|
| _this变量 | 所有浏览器 | 高 |
| bind | IE9+ | 中 |
| 箭头函数 | ES6环境 | 高 |
总结建议
在老项目或需要兼容旧环境时,用 var _this = this 依然简单可靠。在新代码中,优先使用箭头函数或bind来避免this丢失。理解this绑定机制,才能知道何时真正需要_this,而不是盲目保存。
JavaScriptthis绑定_this修改时间:2026-07-27 13:12:24