درک کلوژرها در جاوااسکریپت: حفظ حالت و حفاظت از دادهها
۱۴۰۳/۵/۵Closure یکی از ویژگیهای جالب و مفید در جاوااسکریپت است که به ما کمک میکند تا از اختلال در مقدار متغیرها جلوگیری کنیم. بیایید با هم بررسی کنیم که کلوژرها چطور با دو عامل اصلی یعنی حفظ وضعیت (حالت یا state یا مقدار) و محافظت از دادهها، این کار رو انجام میدن.
کلوژر چیه؟
کلوژر وقتی درست میشه که یک تابع داخلی (یا همون nested function) به متغیرهای بیرونی خودش دسترسی داشته باشه، حتی بعد از اینکه اون تابع بیرونی تموم بشه. این باعث میشه که تابع داخلی همچنان به دادههای اون محیط دسترسی داشته باشه.
مثلاً:
function outerFunction() {
let outerVariable = 'I am outside!';
function innerFunction() {
console.log(outerVariable); // 'I am outside!'
}
return innerFunction;
}
const myFunction = outerFunction();
myFunction();
در اینجا، innerFunction
به متغیر outerVariable
دسترسی داره، حتی وقتی که outerFunction
تموم شده.
حفظ وضعیت با کلوژرها
یکی از ویژگیهای جالب کلوژرها اینه که میتونن وضعیت (state) رو حفظ کنن. یعنی وقتی یک تابع داخلی به یک متغیر در تابع بیرونی دسترسی پیدا میکنه، مقدار اون متغیر در طول حیات تابع داخلی ثابت میمونه.
مثال:
function counter() {
let count = 0;
return function() {
count++;
return count;
};
}
const myCounter = counter();
console.log(myCounter()); // 1
console.log(myCounter()); // 2
console.log(myCounter()); // 3
اینجا، متغیر count
در کلوژر ذخیره میشه و با هر بار فراخوانی تابع داخلی، مقدارش بیشتر میشه. اینطوری میتونیم وضعیت رو به راحتی مدیریت کنیم.
محافظت از دادهها با کلوژرها
کلوژرها همچنین میتونن به ما کمک کنن که دادههامون رو از دسترسی مستقیم محافظت کنیم. با استفاده از کلوژرها، میتونیم متغیرها رو از دیدن مستقیم خارج از تابع مخفی نگه داریم.
مثال:
function secretHolder(secret) {
return function() {
return secret;
};
}
const getSecret = secretHolder('mySecret');
console.log(getSecret()); // 'mySecret'
در اینجا، متغیر secret
فقط از طریق تابعی که secretHolder
برمیگردونه قابل دسترسیه و از دسترسی مستقیم محافظت میشه.
کلوژرها و توابع pure
توابع pure، توابعی هستن که برای ورودیهای مشابه، خروجیهای مشابه تولید میکنن و هیچ اثر جانبی ندارن. در حالی که کلوژرها و توابع pure هر دو به مدیریت وضعیت و دادهها کمک میکنن، اما تفاوتهایی دارن.
توابع pure هیچ وابستگی به وضعیت خارجی ندارن و نمیتونن وضعیت رو تغییر بدن. این به نوشتن کدهای قابل پیشبینی و تستپذیر کمک میکنه.
مثال:
function pureAdd(a, b) {
return a + b;
}
console.log(pureAdd(2, 3)); // 5
console.log(pureAdd(2, 3)); // 5
اما کلوژرها میتونن به متغیرهای خارجی دسترسی پیدا کنن و اونها رو تغییر بدن که باعث میشه توابعی با اثرات جانبی ایجاد بشه.
مثال:
function impureAdd(a) {
let b = 3;
return function() {
return a + b++;
};
}
const addWithThree = impureAdd(2);
console.log(addWithThree()); // 5
console.log(addWithThree()); // 6
در اینجا، تابع impureAdd
یک کلوژر هست که متغیر b
رو تغییر میده و به همین دلیل یک تابع pure نیست.
نتیجهگیری
کلوژرها ابزارهایی فوقالعاده برای مدیریت وضعیت و حفاظت از دادهها در جاوااسکریپت هستن. این ابزارها به ما کمک میکنن تا از اختلال در مقادیر متغیرها جلوگیری کنیم و کدهایی پایدارتر و امنتر بنویسیم. با این اطلاعات، میتونید بهتر از کلوژرها در پروژههای خودتون استفاده کنید و کدهایی با کیفیت و ایمن بنویسید.