درک کلوژرها در جاوااسکریپت: حفظ حالت و حفاظت از داده‌ها

۱۴۰۳/۵/۵
closure

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 نیست.

نتیجه‌گیری

کلوژرها ابزارهایی فوق‌العاده برای مدیریت وضعیت و حفاظت از داده‌ها در جاوااسکریپت هستن. این ابزارها به ما کمک می‌کنن تا از اختلال در مقادیر متغیرها جلوگیری کنیم و کدهایی پایدارتر و امن‌تر بنویسیم. با این اطلاعات، می‌تونید بهتر از کلوژرها در پروژه‌های خودتون استفاده کنید و کدهایی با کیفیت و ایمن بنویسید.

دسته‌بندی‌ها:

© 2024. تمامی حقوق محفوظ است