Middle
Pastāsti par funkciju kontekstu JavaScript.
sobes.tech AI
Atbilde no AI
JavaScript-ā funkcijas izpildes konteksts (this) nosaka, kā funkcija tiek izsaukta un kādas vērtības ir pieejamas tās iekšpusē. Konteksts dinamiski mainās atkarībā no izsaukšanas veida:
- Globālais konteksts: ārpus funkcijām,
thisatsaucas uz globālo objektu (windowpārlūkprogrammā,globalNode.js).// Pārlūkprogrammā console.log(this === window); // true // Node.js console.log(this === global); // true - Funkcijas konteksts:
- Standarta izsaukums: Ne-strict režīmā
thisatsaucas uz globālo objektu (ja funkcija nav objekta metode). Strict režīmā ("use strict";)thisbūsundefined.function showThis() { console.log(this); } showThis(); // Ne-strict režīmā: Globālais objekts; Strict režīmā: `undefined` - Izsaukums kā objekta metode:
thisatsaucas uz objektu, kam pieder metode:
const user = { name: 'Alice', greet: function() { console.log("Hello, my name is " + this.name); } }; user.greet(); // Hello, my name is Alice - Izsaukums ar
new(konstruktors):- Izveido jaunu objektu, kas kļūst par
thisvērtību konstruktorā, un atgriež šo objektu:
function Person(name) { this.name = name; } const person1 = new Person('Bob'); console.log(person1.name); // Bob - Izveido jaunu objektu, kas kļūst par
- Īpašas konteksta norādīšana (
call,apply,bind):call(thisArg, arg1, arg2, ...): Izsauc funkciju ar norādītothisun argumentiem.apply(thisArg, [argsArray]): Izsauc funkciju ar norādītothisun argumentiem masīvā.bind(thisArg, arg1, arg2, ...): Atgriež jaunu funkciju, kurasthisir pastāvīgi saistīts arthisArgun argumentiem.
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?
- Standarta izsaukums: Ne-strict režīmā
- Arrow funkcijas: Tām nav savs
this. Tās ņemthisno apkārtējās leksiskās vides, kur tās tika definētas:const obj = { name: 'David', sayLater: function() { // `this` šeit atsaucas uz `obj` setTimeout(() => { // `this` šeit arī atsaucas uz `obj` (manto no `sayLater`) console.log("Later, I am " + this.name); }, 1000); } }; obj.sayLater(); // Later, I am David