本页提供了JavaScript函数和this关键字的技术解释,探讨了它们在不同上下文中的行为。这些概念是JavaScript的基础,并且在技术面试中经常被考察。
JavaScript函数是第一类对象,可以被赋值给变量、作为参数传递、从其他函数返回,并且拥有属性和方法。这赋予了JavaScript强大的函数式编程能力。
来源: README.md57-64 README.md356-393 README.md1039-1062
函数声明会被完全提升,而函数表达式则像变量一样被提升(只提升声明,不提升定义)。
ES6引入了箭头函数,它与常规函数有显著差异,尤其是在处理this上下文方面。
来源: README.md118-146
仓库中的第3题说明了这一关键区别
在这个例子中,diameter()是一个常规函数,其中this指向shape对象。但perimeter()是一个箭头函数,其中this继承自其周围的词法上下文(可能是window/全局),导致this.radius为undefined。
IIFE在定义时立即执行,创建了一个私有作用域
构造函数与new关键字一起使用来创建对象实例
来源: README.md398-445 README.md1607-1627
this 关键字this关键字是JavaScript中最强大但也最令人困惑的特性之一。它的值会根据函数的调用方式而变化。
来源: README.md118-146 README.md1007-1033
在全局上下文或在全局上下文中调用的函数内部,this指向全局对象
当函数作为对象的方法被调用时,this指向该对象
来源: README.md118-146
当函数与new关键字一起作为构造函数使用时,this指向新创建的实例
来源: README.md398-445
箭头函数没有自己的this绑定。相反,它们从封闭的词法上下文继承this。
仓库中的第3题清晰地阐述了这一概念,其中作为对象方法使用的箭头函数无法通过this访问对象的属性。
来源: README.md118-146
this的方法JavaScript提供了三种明确控制this指向的方法:call()、apply()和bind()。
第33题展示了call()和bind()的区别
这里,call()立即执行函数,并将person作为this;而bind()则返回一个新函数,其this永久绑定到person。
this上下文当你从对象中提取一个方法并独立调用它时,它会失去其上下文
new的构造函数如果你在调用构造函数时忘记使用new关键字,this将指向全局对象而不是新的实例。
这在仓库的第12题中有所体现。
来源: README.md398-445
静态方法属于类/构造函数本身,而实例方法属于原型,并可用于实例。
第11题清晰地展示了这种区别。
来源: README.md356-393 README.md398-445 README.md1007-1033 README.md1039-1062
this上下文时。{ method() {} }而不是{ method: function() {} }。bind():当将方法作为回调函数传递时,以保持正确的this上下文。new关键字。this行为| 函数类型 | this绑定 | 提升 (Hoisting) | 示例 |
|---|---|---|---|
| 函数声明 | 动态 | 完整版 | function name() {} |
| 函数表达式 | 动态 | 可变 | const name = function() {} |
| 箭头函数 | 词法(继承) | 可变 | const name = () => {} |
| 方法定义 | 对象 | 无 | object = { method() {} } |
| 构造函数 | 新实例 | 完整版 | function Name() {} |
| IIFE | 动态 | 无 | (function() {})() |
来源: README.md118-146 README.md356-393 README.md398-445 README.md1007-1033 README.md1039-1062
JavaScript函数是多功能的、第一类对象,具有各种形式。this关键字在常规函数中是动态作用域的,但在箭头函数中是词法作用域的。理解this在不同上下文中的行为对于JavaScript开发者至关重要,并且是技术面试中常见的问题领域。
有关对象原型和继承的更多信息,请参阅关于对象和原型的3.3节。