#JavaScript#
JavaScript 中的要津字是一个基本办法,往往让生人和有辅导的开荒东谈主员感到困惑。它的值可能会凭据施行函数的高下文而变化,若是不正确领略,它会成为浑浊和伪善的泉源。掌执要津字关于编写干净、高效且可选藏的 JavaScript 代码至关贫瘠。
在这份抽象指南中,咱们将深刻商讨要津词的机制,探索其在不同场景中的行径,并提供实质示例和最好施行来匡助您灵验地应用其力量。
目次
简介全局高下文函数高下文
默许绑定隐式绑定显式绑定新建绑定
箭头函数和词法 thisEvent Handlers 和 this常见陷坑以及若何幸免它们最好施行论断
简介this在 JavaScript 中,这是援用对象的要津字。它所指的对象取决于它的使用风光和位置。与其他一些编程说话 this 老是援用面前实例不同,在 JavaScript 中,this 的值取决于函数的调用风光,而不是界说函数的位置或风光。领略至关贫瘠,因为它允许函数对对象进行天确切援用,从而杀青鼎新态和可重用的代码。然则,这种天真性也可能导致浑浊,尤其是在处理嵌套函数、回合并事件处理法子时。this全局高下文When 在职何函数或对象以外使用时,它援用全局对象。在 Web 浏览器中,全局对象为 .window在 Node.js 中,全局对象为 .global例:
console.log(this === window); // true (in browsers)
这里援用对象,因为代码是在全局边界内施行的。thiswindow
函数高下文
函数里面的行径取决于函数的调用风光。有四个主要规章决定了 in 函数调用的值:thisthis
默许绑定隐式绑定显式绑定新建绑定
默许绑定
在莫得任何高下文的情况下调用函数时,默许为全局对象。this
例:
function showThis() { console.log(this);}showThis(); // Logs the global object (window in browsers)
严格模式
在严格模式 () 中,在莫得高下文的情况下调用的函数里面是 .'use strict';thisundefined
例:
'use strict';function showThis() { console.log(this);}showThis(); // undefined
此行径有助于防护不测修改全局对象。
隐式绑定
当函数手脚对象的依次调用时,援用点 () 之前的对象。this.
例:
const person = { name: 'Alice', greet: function () { console.log(`Hello, my name is ${this.name}.`); },};person.greet(); // Hello, my name is Alice.
此处,inside援用对象,因为手脚的依次调用 。thisgreetpersongreetperson
嵌套对象
然则,隐式绑定可能会在嵌套函数中丢失。
例:
const person = { name: 'Bob', greet: function () { function innerFunction() { console.log(`Hello, my name is ${this.name}.`); } innerFunction(); },};person.greet(); // Hello, my name is undefined.
在这种情况下, inside 援用全局对象,而不是 。thisinnerFunctionperson
显式绑定
您不错使用 、 或 显式诞生值。thiscallapplybind
call依次
该依次调器具有指定值和单独提供的参数的函数。callthis
例:
function greet(greeting) { console.log(`${greeting}, my name is ${this.name}.`);}const person = { name: 'Charlie' };greet.call(person, 'Hi'); // Hi, my name is Charlie.
apply依次
该依次近似于 ,但参数以数组的样子提供。applycall
例:
greet.apply(person, ['Hello']); // Hello, my name is Charlie.
bind依次
该依次创建一个具有绑定值的新函数。bindthis
例:
const greetPerson = greet.bind(person);greetPerson('Hey'); // Hey, my name is Charlie.
新建绑定
当函数用作带关系键字的构造函数时,援用新创建的对象。newthis
例:
function Person(name) { this.name = name;}const dave = new Person('Dave');console.log(dave.name); // Dave
在此示例中,构造函数里面援用 new object 。thisPersondave
箭头函数和词法this箭头函数 () 对 具有私有的行径。它们莫得我方的绑定。相背,它们从禁闭的词法高下文秉承。=>thisthisthis例:
const person = { name: 'Eve', greet: function () { const innerFunc = () => { console.log(`Hello, my name is ${this.name}.`); }; innerFunc(); },};person.greet(); // Hello, my name is Eve.
这里是一个箭头函数,因此它秉承自依次,即 。innerFuncthisgreetperson
箭头函数手脚依次
使用箭头函数手脚依次可能会导致不测值。this
例:
const person = { name: 'Frank', greet: () => { console.log(`Hello, my name is ${this.name}.`); },};person.greet(); // Hello, my name is undefined.
在这种情况下,箭头函数不援用而是援用禁闭边界的 ,它是全局对象。thispersonthis事件处理法子和this
在事件处理法子中,庸碌是指摄取事件的元素。this
例:
<button id="myButton">Click me</button>
document.getElementById('myButton').addEventListener('click', function () { console.log(this.id); // myButton});
此处,是指摄取 click 事件的元素。thisbutton
事件处理法子中的箭头函数
若是使用箭头函数手脚事件处理法子,则不援用事件想法。this
例:
document.getElementById('myButton').addEventListener('click', () => { console.log(this); // Window object});
由于箭头函数莫得我方的,因此它们从禁闭边界秉承它,在这种情况下是全局对象。this
常见陷坑以及若何幸免它们在回调中丢失高下文this将对象依次手脚回调传递时,庸碌会丢失原始高下文。this例:
const person = { name: 'Grace', greet: function () { console.log(`Hello, my name is ${this.name}.`); },};setTimeout(person.greet, 1000); // Hello, my name is undefined.
此处,inside 援用全局对象,因为该函数是在莫得高下文的情况下调用的。thisgreet
措置决策
使用 bind 开荒此高下文
setTimeout(person.greet.bind(person), 1000); // Hello, my name is Grace.
包装在匿名函数中
setTimeout(function () { person.greet(); }, 1000)
使用箭头函数
setTimeout(() => person.greet(), 1000)