Middle
Papaskink apie funkcijų kontekstą JavaScript.
sobes.tech AI
Atsakymas iš AI
„this“ vykdymo kontekstas JavaScript nustato, kaip kviečiama funkcija ir kokios reikšmės yra prieinamos jos viduje. Kontekstas dinamiškai keičiasi priklausomai nuo kvietimo būdo:
- Pasaulinis kontekstas: Už funkcijų ribų,
thisnurodo į globalų objektą (windownaršyklėje,globalNode.js).// Naršyklėje console.log(this === window); // true // Node.js console.log(this === global); // true - Funkcijos kontekstas:
- Standartinis kvietimas: Ne-strict režimu
thisnurodo į globalų objektą (jei funkcija nėra objekto metodas). Strict režimu ("use strict";)thisbusundefined.function showThis() { console.log(this); } showThis(); // Ne-strict režimu: Globalus objektas; Strict režimu: `undefined` - Kvietimas kaip objekto metodas:
thisnurodo į objektą, kuriam priklauso metodas:
const user = { name: 'Alice', greet: function() { console.log("Hello, my name is " + this.name); } }; user.greet(); // Hello, my name is Alice - Kvietimas su
new(konstruktorius):- Sukuria naują objektą, kuris tampa
thisreikšme konstruktoriaus funkcijoje, ir grąžina tą objektą:
function Person(name) { this.name = name; } const person1 = new Person('Bob'); console.log(person1.name); // Bob - Sukuria naują objektą, kuris tampa
- Aiškus konteksto nurodymas (
call,apply,bind):call(thisArg, arg1, arg2, ...): Kviečia funkciją su nurodytuthisir atskirai išvardytais argumentais.apply(thisArg, [argsArray]): Kviečia funkciją su nurodytuthisir argumentais masyve.bind(thisArg, arg1, arg2, ...): Grąžina naują funkciją, kuriosthisyra amžinai susietas suthisArgir argumentais.
function introduce(greeting, punctuation) { console.log(greeting + ", I am " + this.name + punctuation); } const person = { name: 'Charlie' }; introduce.call(person, "Hi", "!"); // Hi, I am Charlie! introduce.apply(person, ["Hello", "."]); // Hello, I am Charlie. const boundIntroduce = introduce.bind(person, "Hey"); boundIntroduce("?"); // Hey, I am Charlie?
- Standartinis kvietimas: Ne-strict režimu
- Arrow funkcijos: Neturi savo
this. Jos paimathisiš aplinkos, kurioje buvo apibrėžtos:const obj = { name: 'David', sayLater: function() { // `this` čia nurodo į `obj` setTimeout(() => { // `this` čia taip pat nurodo į `obj` (paveldėta iš `sayLater`) console.log("Later, I am " + this.name); }, 1000); } }; obj.sayLater(); // Later, I am David