javascript 中函数调用时的 this 指向取决于具体的调用方式,在普通函数直接调用时默认指向全局对象(浏览器中为 window),而在严格模式下则指向 undefined。要确定具体场景下的 this 值,需要区分是作为方法调用、构造函数调用还是通过 call/apply/bind 强制绑定。

非严格模式下普通函数调用的 this 指向
在非严格模式的 JavaScript 代码中,当一个函数被作为普通函数直接调用时,this 关键字会指向全局对象。在浏览器环境中,这个全局对象就是 window 对象。这意味着如果你在函数内部访问 this.property,你实际上是在访问或修改全局变量。这种行为常常导致意外的副作用,特别是在模块化开发中,因为全局污染是一个严重的问题。理解这一点有助于排查为什么某些变量在函数内外表现不一致。

function checkThis() {
console.log(this === window);
}
checkThis(); // 输出 true
严格模式下普通函数调用的 this 指向
当代码处于严格模式(use strict)时,普通函数调用的行为发生了改变。此时,this 不再指向全局对象,而是保持为 undefined。这是 ECMAScript 5 引入的一项改进,旨在防止意外创建全局变量并帮助开发者更早地发现错误。如果尝试访问 undefined 的属性,将会抛出 TypeError 异常,从而迫使开发者显式地处理上下文绑定问题。这对于构建健壮的应用程序至关重要,因为它消除了隐式全局绑定的模糊性。

'use strict';
function checkStrictThis() {
console.log(this === undefined);
}
checkStrictThis(); // 输出 true
基于箭头函数与普通函数 this 差异的具体问题
在分析程序中某个输入或条件时,一个常见的问题是为什么箭头函数中的 this 指向与常规函数不同。箭头函数没有自己的 this 绑定,它继承自外层执行上下文的 this 值。这意味着无论箭头函数如何被调用,其内部的 this 始终等于定义该箭头函数时所处的作用域中的 this。这种特性使得箭头函数在处理回调函数和事件处理器时非常有用,因为它避免了传统函数中常见的 this 丢失问题。例如,在对象方法中使用箭头函数可以确保回调函数中的 this 仍然指向该对象实例,而不是全局对象或 undefined。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











