შიდა მარყუჟების დახურვა - JS ინტერვიუს კითხვა

ბლოგი

შიდა მარყუჟების დახურვა - JS ინტერვიუს კითხვა

ინტერვიუერების ფავორიტი! უზარმაზარი ალბათობა იმისა, რომ თქვენს Javascript ინტერვიუში შეიძლება დაგისვათ კითხვა მარყუჟების დახურვის შესახებ. ნება მომეცით გითხრათ, რომ თქვენს ინტერვიუერს ნამდვილად ექნება შთაბეჭდილება, თუ თქვენ შეძლებთ მასზე პასუხის გაცემას.



ინტერვიუს რაუნდი

სკრინინგი/ადრეული რაუნდები.



თქვენ შეგიძლიათ ველით ამ Javascript ინტერვიუს შეკითხვას თქვენს სკრინინგზე ან ადრეულ რაუნდებში. გასაკვირი არ არის, თუ ამ კონცეფციაზე დაფუძნებულ პრობლემებს ხედავთ ინტერვიუს შემდგომ ეტაპებზეც.

გამოყენებული ცნებები

სფეროები და დახურვები. Async JS.



თქვენ გჭირდებათ კარგი გაგება სფეროების შესახებ და როგორ მუშაობს დახურვა Javascript– ში ამაზე პასუხის გასაცემად. ამ პრობლემის განსხვავებული ვარიაციები შეიძლება იყოს.

გადახედეთ ქვემოთ მოცემულ კოდის ფრაგმენტს. როგორი უნდა იყოს მოსალოდნელი გამომუშავება?

for (var i = 0; i <3; i++) { setTimeout(function() { console.log(i); }, 200); }

ეს შენი პასუხია?

0 1 2

თუ კი, გაითვალისწინე ჩემი რჩევა, გააუქმეთ ყველა დაგეგმილი Javascript/Front-end ინტერვიუები ეხლა. თქვენ ჯერ არ ხართ მზად ინტერვიუსთვის. დიახ, სერიოზულად!

ეს არის ჩვეულებრივი შეცდომა, რომელსაც უშვებენ კანდიდატები. დამიჯერეთ, ეს შეცდომა საკმარისია წითელი დროშის ასამაღლებლად.

Სწორი პასუხი

3 3 3

ჩვენ აქ დახურვა გვაქვს. შიდა ანონიმურ ფუნქციას, რომელიც გადაეცემა setTimeout– ს აქვს წვდომა მის გარე სფეროს ცვლადზე | _+_ |. თუ იცით როგორ მუშაობს ქრონომეტრები, setTimeout– ისთვის მიწოდებული ფუნქცია დაუყოვნებლივ არ შესრულდება. იგი დაემატება ღონისძიების მარყუჟს, როდესაც 200ms ტაიმერი იწურება.

დახურვის არსებობის გამო, ანონიმურ ფუნქციას მაინც ექნება წვდომა ცვლადზე | _+_ | მაშინაც კი, როდესაც for მარყუჟის დასრულება შესრულებულია. ეს ნიშნავს, რომ სამი ანონიმური ფუნქციიდან რომელიმე ასრულებს, | _++|. მნიშვნელობას იქნება 3 (მარყუჟის დასასრული).

სამივე ანონიმურ ფუნქციას ექნება წვდომა ერთი და იგივე | _+_ |. Გთხოვთ გაითვალისწინოთ - ცალკეული ასლები i არ გადაეცემა თითოეულ ანონიმურ ფუნქციას.

თითოეული მათგანი დაბეჭდავს | _+_ | - ის უახლეს მნიშვნელობას.

შემდგომი კითხვა

რა მოხდება, თუ ჩვენ შევცვლით ტაიმერს 200ms– დან 0 – მდე?

i

აჰ! ეს ადვილია ახლა ეს უნდა იყოს:

i

ნამდვილად არა, ეს არასწორი პასუხია.

კიდევ ერთი გავრცელებული არასწორი პასუხი, რაც მე მომისმენია არის ის, რომ ეს შეიძლება იყოს რაიმე _ _+_ | შორის, რადგან ჩვენ არ ვიცით როდის დასრულდება ტაიმუატი.

ტაიმერები ასე არ მუშაობს. მაშინაც კი, თუ თქვენ დააყენებთ დროის გასვლას | _++|, ანონიმური ფუნქცია დაუყოვნებლივ არ შესრულდება. ის დაემატება ღონისძიების რიგში. ამრიგად, for მარყუჟისათვის აუცილებლად იქნებოდა დასრულებული რომელიმე ამ ანონიმური ფუნქციის შესრულებამდე. სწორი პასუხი იგივე რჩება.

i

დახურვა მარყუჟების შიგნით - როგორ გავასწორო ის?

მარყუჟის დახურვის დასაფიქსირებლად, თქვენ უნდა როგორმე შექმნათ | _+_ |. ასლი და გადაეცი ეგ ასლი შენს შინაგან ფუნქციას. აი როგორ აკეთებთ ამას:

გამოსავალი #1

როგორ გამოვიყენოთ zenbot

გამოიყენეთ IIFE (დაუყოვნებლივ გამოძახებული ფუნქციის გამოხატვა)

IIFE სრულდება როგორც კი განსაზღვრულია. ღირებულება | _+_ | ამ კონკრეტული გამეორების დროს კოპირდება და იქმნება ახალი ლექსიკური სფერო თითოეული ამ ფუნქციისთვის.

ასე რომ, ანონიმური ფუნქციები გადავიდა | _+_ | ეხლა იქნება მითითებული | _+_ |. და თქვენ მიიღებთ მოსალოდნელ შედეგს.

**i**

იგივე მიდგომის გამოყენებით შეგიძლიათ უბრალოდ გაიაროთ | _+_ | ქვემოთ როგორც ფუნქციის პარამეტრი.

i

გამოსავალი #2 (რეკომენდირებულია)

შეცვალეთ | _+_ | | | _+_ | განმეორებითი ცვლადის შესაქმნელად. | _+_ | არის ბლოკირებული. ასე რომ, განსხვავებით a _ _+_ |, ერთი და იგივე ლექსიკური მოცულობა არ არის განაწილებული for მარყუჟის სხვადასხვა გამეორებებს შორის. ყოველი გამეორებისთვის იქმნება ახალი ლექსიკური სფერო. თითოეულ ანონიმურ ფუნქციას, რომელიც გადაეცემა setTimeout– ს, ახლა ექნება წვდომა | _+_ |.

for (var i = 0; i <3; i++) { setTimeout(function() { console.log(i); }, 0); }

ამ კონკრეტული კოდის მაგალითია დახურვა Javascript– ის მარყუჟებში საკმაოდ გავრცელებულია თქვენ ზოგადად ნახავთ მის ვარიაციებს ინტერვიუებში. თქვენ უბრალოდ უნდა ეცადოთ მოძებნოთ ქვემოთ განხილული ნიმუში.

#დახურვა #ინტერვიუ #ინტერვიუ-კითხვები

js-interview.com

შიდა მარყუჟების დახურვა - JS ინტერვიუს კითხვა

ინტერვიუერების ფავორიტი! უზარმაზარი ალბათობა იმისა, რომ თქვენს Javascript ინტერვიუში შეიძლება დაგისვათ კითხვა მარყუჟების დახურვის შესახებ. ნება მომეცით გითხრათ, რომ თქვენს ინტერვიუერს ნამდვილად ექნება შთაბეჭდილება, თუ თქვენ შეძლებთ მასზე პასუხის გაცემას.