ფუნქციების ლექსიკური გარემოს გამოყენება JavaScript-ში
დავუშვათ გვაქვს ფუნქცია, რომელიც თავისი შედეგის როგორც აბრუნებს სხვა ფუნქციას:
function test() {
return function() {
}
}
თუ მშობელ ფუნქციას აქვს რაიმე ცვლადები, მაშინ ეს ცვლადები შეიცავდნენ დაბრუნებული ფუნქციის ლექსიკურ გარემოში:
function test() {
let num = 1; // მშობელი ფუნქციის ცვლადი
return function() {
// ლექსიკური გარემო = {num: 1}
}
}
დავწეროთ ჩვენი დაბრუნებული ფუნქციის კოდში
console.log, რომელიც გამოიტანს ცვლადის
num მნიშვნელობას:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
ახლა მოდით გამოვიძახოთ მშობელი ფუნქცია
test და მისი მუშაობის შედეგი ჩავწეროთ
ცვლადში func:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
ცვლადში func ჩაიწერება დაბრუნებული
ფუნქცია. მოდით გამოვიძახოთ ჩვენი ფუნქცია - თავისი
შედეგით ის გამოიტანს ცვლადის
num შიგთავსს:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func(); // გამოიტანს 1
თუ უბრალოდ შევეცდებით გამოვიტანოთ ცვლადი
num ფუნქციის გარეთ - ის იქნება მიუწვდომელი:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
console.log(num); // ცვლადი num აქ მიუწვდომელია
როგორც ხედავთ, ლოკალური ცვლადი num
მიბმულია ჩვენი
ფუნქციის ლექსიკურ გარემოზე და ახლა, ნებისმიერ ადგილას კოდის
ამ ფუნქციის გამოძახებით, ჩვენ შევძლებთ მივიღოთ
ცვლადის num მნიშვნელობა,
მაშინაც კი, თუ გამოძახების ადგილას
თავისთავად ეს ცვლადი მიუწვდომელია.
სინამდვილეში, მსგავსი შედეგის მიღწევა შეიძლება
ცვლადის num გლობალურად გამოცხადებით:
function test() {
return function() {
console.log(num);
}
}
let num = 1; // გლობალური ცვლადი
let func = test();
func(); // გამოიტანს 1
თუმცა, აქ იქნება არსებითი განსხვავება:
ახალ ვერსიაში ცვლადის num შეცვლა
შესაძლებელია ფუნქციების გარეთ (რადგან ის გლობალურია),
ძველში კი - არა.
განსაზღვრეთ, კოდის გაშვების გარეშე, რა გამოიტანს კონსოლში:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
let func = test();
console.log(func());
განსაზღვრეთ, კოდის გაშვების გარეშე, რა გამოიტანს კონსოლში:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
console.log(test()());
განსაზღვრეთ, კოდის გაშვების გარეშე, რა გამოიტანს კონსოლში:
function test() {
let num1 = 1;
return function() {
return num1 + num2;
}
}
let num2 = 2;
let func = test();
console.log(func());
განსაზღვრეთ, კოდის გაშვების გარეშე, რა გამოიტანს კონსოლში:
function test() {
let num = 1;
return function() {
return num;
}
}
let num = 2;
let func = test();
console.log(func());