„JavaScript“ vadovas tam

thisRaktažodis rankas žemyn yra vienas iš labiausiai plačiai naudojamas ir dar nesuprastas JavaScript. Pabandysiu tai pakeisti šiandien.

Grįžkime į senus gerus mokyklos laikus, kai sužinojome apie įvardžius.

Phelpsas yra plaukimo greitai, nes jis nori laimėti lenktynes.

Atkreipkite dėmesį į įvardžio „jis“ vartojimą. Čia mes tiesiogiai nesikreipiame į Phelpsą, bet vartojame įvardį jis, nurodydamas Phelps . Panašiai „JavaScript“ naudoja thisraktinį žodį kaip referentą, norėdamas nurodyti objektą kontekste, ty temą .

Pavyzdys:

var car= {make: "Lamborghini",model: "Huracán",fullName: function () {console.log(this.make+" " +this.model);console.log(car.make+ " " +car.model);}}car.fullName();

Pirmiau kodas, turime objektą car, kuris turi savybes make, model ir fullName. Reikšmė fullNameyra funkcija, kuri išspausdina visą automobilio pavadinimą naudodama 2 skirtingas sintakses.

  • Naudojant this= & g t; this.make+” “ +this.model the this, jis nurodo objektą kontekste, kuris is car so this.make yra veiksmingas, ly car.mtaigi is this.model.
  • Naudodami taškų žymėjimą galime pasiekti objektų ypatybes car.make ir car.model.

this ar tai!

Dabar, kai supratome, kas yra this ir yra paprasčiausias naudojimas, nustatykime keletą nykščio taisyklių, kad galėtume visada prisiminti.

JS thisraktinis žodis nurodo objektą, kuriam jis priklauso.

var car={make:'....'func:()=>{console.log(this.make)}}

Ankstesniame this fragmente esantis objektas priklauso objekto automobiliui.

Priklausomai nuo naudojimo, reikia skirtingų reikšmių

  1. Metodo viduje.
  2. Funkcijos viduje.
  3. Vienas.
  4. Renginyje.
  5. call()ir apply().

Metodo viduje

Kai thisnaudojamas metodo viduje, jis nurodo savininko objektą.

Objekto viduje apibrėžtos funkcijos vadinamos metodais. Dar kartą paimkime savo automobilio pavyzdį.

var car= {make: "Lamborghini",model: "Huracán",fullName: function () {console.log(this.make+" " +this.model);console.log(car.make+ " " +car.model);}}car.fullName();

fullName()čia yra metodas. thisViduje šis metodas priklauso car.

Funkcijos viduje

this funkcijos viduje yra šiek tiek sudėtinga. Pirmiausia reikia suprasti, kad, kaip ir visi objektai, turi savybių, taip pat funkcijos turi savybių. Kai tik ši funkcija vykdoma, ji gauna thissavybę, kuri yra kintamasis su objekto, kuris ją iškviečia, verte.

tai iš tikrųjų yra tik nuoroda į „ankstesnį objektą“ - iškviečiantį objektą. - javascriptissexy.com

Jei objektas nekviečia this funkcijos, funkcija viduje priklauso visuotiniam objektui, kuris vadinamas langu. Šiuo atveju tai bus susijusi su vertėmis, apibrėžtomis visame pasaulyje. Pažiūrėkime pavyzdį, kaip geriau suprasti:

var make= "Mclaren";var model= "720s"function fullName(){ console.log(this.make+ " " + this.model);}
var car = { make:"Lamborghini", model:"Huracán", fullName:function () { console.log (this.make + " " + this.model); }} car.fullName(); // Lmborghini Huracán window.fullName(); // Mclaren 720S fullName(); // Mclaren 720S

Čia make, modelir fullName yra apibrėžiami globaliai, o car objektas taip pat yra įgyvendinamas fullName . Kai tai iškviečia carobjektas, tai reiškia objekto viduje apibrėžtas savybes. Kita vertus, kiti du funkcijų iškvietimai yra vienodi ir pateikia visuotinai apibrėžtas savybes.

Vienas

Kai naudojamas atskirai, nėra jokios funkcijos ar objekto, this reiškia globalų objektą.

this Čia remiasi pasaulinės vardas turtą.

Renginyje

Įvykiai gali būti bet kokio tipo, tačiau, siekiant paprastumo ir aiškumo, paimkime paspaudimo įvykį.

Kai tik paspaudžiamas mygtukas ir iškyla įvykis, jis gali iškviesti kitą funkciją, kad atliktų tam tikrą užduotį pagal paspaudimą. Jei this jis naudojamas toje funkcijoje, tai bus elementas, kuris iškėlė įvykį. DOM visi elementai yra saugomi kaip objektai. Štai kodėl iškėlus įvykį jis nurodo tą elementą, nes tas tinklalapio elementas iš tikrųjų yra DOM viduje esantis objektas .

Pavyzdys:

 Remove Me!

skambinti (), taikyti () ir susieti ()

  • susieti: leidžia mums nustatyti thismetodų vertę.
  • skambinkite ir kreipkitės: leiskite mums skolintis funkcijas ir nustatykite thisreikšmė iškviečiant funkciją.

Skambinimas, susiejimas ir taikymas savaime yra kito įrašo tema. Jie yra labai svarbūs, todėl jų čia paaiškinti neįmanoma, nes mes turėtume žinoti apie this šių funkcijų naudojimą.

Kebliausia dalis

Jei gerai suprasite, thispalengvinkite mūsų darbą tam tikru būdu. Tačiau yra atvejų, kai jis neteisingai suprantamas.

1 pavyzdys.

var car = {make:"Lamborghini",model:"Huracán",name:null,fullName:function () {this.name=this.make + " " + this.model;console.log (this.name);}}
var anotherCar={make:"Ferrari",model:"Italia",name:null}
 anotherCar.name= car.fullName();

Čia gauname netikėtą rezultatą. Mes pasiskolinome metodą, kuris naudojamas this iš kito objekto, tačiau problema yra ta, kad metodas yra priskirtas tik anotherCar funkcijai, bet iš tikrųjų yra naudojamas car objektui. Todėl rezultatą gauname kaip „Lamborghini“, o ne „Ferrari“.

Norėdami tai išspręsti, mes naudojame call() metodą.

Čia call()metodas reikalauja fullName()ant anotherCar objekto, kuris iš pradžių neturi savo fullName()funkciją.

We can also see that, when we log the car.name and anotherCar.name we get the result for the latter not on former, which means that the function was indeed invoked on anotherCar and not on car.

Example 2.

var cars=[{ make: "Mclaren", model: "720s"},{make: "Ferrari",model: "Italia"}]
var car = {cars:[{make:"Lamborghini", model:"Huracán"}],fullName:function () {console.log(this.cars[0].make + " " + this.cars[0].model);}}var vehicle=car.fullName;vehicle()

In the above snippet we have a global object called cars and we have the same name object inside the car object. The fullName() method is then assigned to the vehicle variable which is then called. The variable belongs to the global object so this calls the global cars object instead of the cars object because of the context.

To resolve that we use .bind() function to solve the issue.

Binding helps us with specifically setting the this value and hence the vehicle variable explicitly points to the car object and not the global object, so this lies in the context of the car object.

Example 3.

var car = {cars:[{make:"Lamborghini",model:"Huracán"},{ make: "Mclaren", model: "720s"},{make: "Ferrari",model: "Italia"}],fullName:function(){this.cars.forEach(()=>{console.log (this.make + " " + this.model);})}}car.fullName();

In the above snippet, the fullName() calls upon a function which iterated through the cars array using forEach. Inside the forEach there is an anonymous function where this loses context. A function inside a function in JavaScript is called a closure. Closures are very important and widely used in JavaScript.

Another important concept playing a role here is scope. A variable inside a function cannot access variables and properties outside its scope. this inside the anon function cannot access this outside it. So this has nowhere to go but to point to global object. But there, no property is defined for this to access so undefined is printed.

A workaround for the above is that we can assign a variable the value of this, outside the anonymous function and then use it inside it.

Here, the self variable contains the value of this which is used with the inner function thus giving us the output.

Example 4.

var car= {make: "Lamborghini",model: "Huracán",fullName: function (cars) {cars.forEach(function(vehicle){console.log(vehicle +" "+ this.model);})}}car.fullName(['lambo','ferrari','porsche']);

This is a revisited example, in which this wasn't accessible so we preserved it's value by using a variable called self. Let's use arrow function to solve the same:

As you can see, using an arrow function in forEach() automatically solves the problem and we don’t have to do bind, or give the this value to some other variable. This is because arrow functions bind their context so this actually refers to the originating context, or the originating object.

Example 5.

var car= {make: "Lamborghini",model: "Huracán",fullName: function () {console.log(this.make +" "+ this.model);}}var truck= {make: "Tesla",model: "Truck",fullName: function (callback) {console.log(this.make +" "+ this.model);callback();}}truck.fullName(car.fullName);

The above code consists of two identical objects, with one containing a callback function. A callback function is a function passed into another function as an argument, which is then invoked inside the outer function to complete some kind of routine.

Here, the truck object’s fullName method consists of a callback which is also invoked inside it. Our car object is as before. When we invoke the truck’s fullName method with the callback(argument) as the fullName method of the car object, we get output as Tesla Truck and undefined undefined.

After reading about this some of you might have gotten a hunch that car.fullName would print the model and make of the truck object, but to your disappointment, this again played a trick on us. Here the car.fullName is passed as an argument and is not actually invoked by the truck object. The callback invokes the car object method, but note that the actual call site for the function is the callback which binds this to the global object. It's a bit confusing, so read it again!

Here to get clarity, we print this itself. We can see that the this of callback is given a global scope. So to get a result we create global make and model properties.

Again, running the same code with global make and model properties we finally get the answer to the global this. This proves that this references the global object.

To get the results which we desire, the car.fullName result we will again use bind() to hard-bind the car object to the callback, which will make everything right again.

Solved!

No doubt that this is very useful, but has it's own pitfalls too. Hope I made it quite easy for you to understand. If you want more content simplified like this, follow me on Medium. Please leave your responses and share this if you liked it.