Middle
Räägi JavaScripti funktsioonide kontekstist.
sobes.tech AI
Vastus AI-lt
JavaScriptis määrab funktsiooni täitmise konteksti (this), kuidas funktsioon kutsutakse ja millised väärtused on selle sees saadaval. Kontekst muutub dünaamiliselt sõltuvalt kutsumise viisist:
- Globaalne kontekst: Funktsioonide väliselt viitab
thisglobaalsele objektile (windowbrauseris,globalNode.js-is).// Brauseris console.log(this === window); // true // Node.js-is console.log(this === global); // true - Funktsiooni kontekst:
- Tavaline kutsumine: Mitte-strict režiimis viitab
thisglobaalsele objektile (kui funktsioon ei ole objekti meetod). Strict režiimis ("use strict";) onthisundefined.function showThis() { console.log(this); } showThis(); // Mitte-strict režiimis: Globaalne objekt; Strict režiimis: `undefined` - Kutsumine objekti meetodina:
thisviitab objekti, millele meetod kuulub, kontekstile:
const user = { name: 'Alice', greet: function() { console.log("Hello, my name is " + this.name); } }; user.greet(); // Hello, my name is Alice - Kutsumine
new-ga (konstruktor):- Loob uue objekti, mis muutub
this-ks konstruktorifunktsioonis ja tagastab selle objekti:
function Person(name) { this.name = name; } const person1 = new Person('Bob'); console.log(person1.name); // Bob - Loob uue objekti, mis muutub
- Selge konteksti määramine (
call,apply,bind):call(thisArg, arg1, arg2, ...): Kutsub funktsiooni määratudthis-ga ja argumentidega.apply(thisArg, [argsArray]): Kutsub funktsiooni määratudthis-ga ja argumentide massiiviga.bind(thisArg, arg1, arg2, ...): Tagastab uue funktsiooni, millethison igavesti seotudthisArg-ga ja argumentidega.
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?
- Tavaline kutsumine: Mitte-strict režiimis viitab
- Arrow funktsioonid: Neil ei ole oma
this. Nad haaravadthisümbritsevast leksikaalsest kontekstist:const obj = { name: 'David', sayLater: function() { // `this` viitab `obj` setTimeout(() => { // `this` viitab samuti `obj` (pärandatud `sayLater`-ist) console.log("Later, I am " + this.name); }, 1000); } }; obj.sayLater(); // Later, I am David