JavaScript中this的指向在运行期确定,执行上下文创建时即绑定:它取决于函数调用方式而非定义位置,受严格模式、调用者对象、new/call/apply/bind及箭头函数继承等运行时因素影响。

JavaScript 中 this 的指向是在运行期确定的,不是编译期。
执行上下文创建时才绑定 this
当 JavaScript 引擎开始执行一段代码(比如调用一个函数),会先创建对应的执行上下文。在该上下文的创建阶段,引擎就根据当前的调用方式决定 this 的值。这个过程发生在代码真正运行时,而非代码被解析或预编译时。
为什么不是编译期?
因为 this 的值依赖于函数“怎么被调用”,而不是“在哪里定义”:
- 同一个函数,赋值给不同对象后调用,this 可能指向不同对象;
- 同一个函数,用
call、apply或bind调用,this 可被显式覆盖; - 箭头函数虽不绑定自己的 this,但它继承的是外层运行时已确定的非箭头函数的 this 值,不是靠词法分析静态推导出来的。
对比:变量查找是编译期,this 是运行期
变量作用域(如 myName)遵循词法作用域,在代码写完时就确定了查找路径;而 this 没有这种静态性——它必须等函数实际被调用那一刻,结合调用栈、调用者、是否使用 new 或绑定方法等运行时信息,才能明确指向谁。
立即学习“Java免费学习笔记(深入)”;
严格模式会影响运行时结果
例如独立调用函数时:
- 非严格模式:this 指向
window(浏览器)或global(Node.js); - 严格模式:this 就是
undefined。
这种差异只能在运行时根据当前执行上下文的严格状态判断,进一步印证了 this 的动态性。


















