متد bind در جاوا اسکریپت<!-- --> - Husen's Blog

متد bind در جاوا اسکریپت

در این آموزش متد bind() را با مثال های کاربردی منحصربه‌فرد بررسی می کنیم.

تنظیم مقدار this برای یک تابع

یکی از کاربردهای اولیه متد ()bind تنظیم مقدار this یک تابع به یک Object خاص بدون تغییر تابع اصلی است. این به ویژه زمانی مفید است که می خواهید یک تابع با یک Object خاص کار کند اما نمی خواهید خود تابع را تغییر دهید.

const projects = new Projects()
projects.display()

const studentA = {
    name: 'Sophia',
    score: 85,
    result() {
        console.log(`${this.name}'s score is ${this.score}.`)
    }
}

const studentB = {
    name: 'Lucas',
    score: 92
}

const boundResult = studentA.result.bind(studentB)

boundResult() // Lucas's score is 92.

در این مثال، یک Object studentA با متد result() داریم که از کلمه کلیدی this برای اشاره به Object استفاده می کند. ما همچنین یک Object دیگر، studentB، با ویژگی های name و score داریم. با فراخوانی متد ()bind در studentA.result()، studentB را به عنوان مقدار this ارسال می کنیم و آن را به طور موثر به studentB متصل می کنیم. هنگامی که boundResult() فراخوانی می شود، کلمه کلیدی this در تابع به جای studentA به studentB اشاره می کند.

ایجاد تابع با آرگومان های از پیش تعیین شده

متد bind() به شما امکان می دهد یک تابع جدید با آرگومان های از پیش تایین شده ایجاد کنید. این می تواند زمانی مفید باشد که به یک تابع نیاز دارید که همیشه از آرگومان های خاص بدون تغییر تابع اصلی استفاده کند.

function multiply(x, y) {
    return x * y
}

const multiplyByFive = multiply.bind(null, 5)

console.log(multiplyByFive(3)) // 15
console.log(multiplyByFive(4)) // 20

در این مثال، تابع multiply() دو آرگومان را می گیرد و حاصل جمع آنها را برمی گرداند. سپس یک تابع جدید، multiplyByFive() با فراخوانی bind() روی multiply() ایجاد می کنیم. ما null را به عنوان مقدار this و 5 را به عنوان اولین آرگومان پاس می کنیم. این تضمین می کند که وقتی multiplyByFive() فراخوانی می شود، همیشه آرگومان ارسال شده را در 5 ضرب می کند، بدون نیاز به تغییر تابع multiply() اصلی.

استفاده از bind() با کنترل کننده رویداد

متد bind() همچنین می‌تواند هنگام کار با event handler ها مفید باشد، زیرا به شما امکان می‌دهد مقدار this را در تابع handler تنظیم کنید. این می تواند به ویژه هنگام استفاده از متد های Object به عنوان event handler مفید باشد.

const buttonController = {
    button: document.getElementById('myButton'),
    message: 'Button clicked!',
    handleClick() {
        console.log(this.message)
    },
    init() {
        this.button.addEventListener('click', this.handleClick.bind(this))
    }
}

buttonController.init()

در این مثال، ما یک Object buttonController داریم که شامل متد handleClick() برای ثبت پیام در هنگام کلیک روی دکمه است. با استفاده از bind() برای تنظیم مقدار this در متد handleClick()، اطمینان حاصل می کنیم که this.message به مقدار message آبجکت buttonController اشاره می کند.

کاربرد جزئی bind()

متد ()bind به شما اجازه می دهد تا به طور جزئی از آرگومان ها استفاده کنید و شما را قادر می سازد که تعداد مشخصی از آرگومان ها را برای یک تابع بصورت ثابت ارسال کنید، در حالی که بقیه آرگومان ها را بعداً ارسال کنید. این می تواند برای ایجاد نسخه های تخصصی تر از توابع معمولی کاربردی باشد.

function product(a, b, c) {
    return a * b * c
}

const doubleProduct = product.bind(null, 2)

console.log(doubleProduct(3, 4)) // 24 (2 * 3 * 4)
console.log(doubleProduct(5, 6)) // 60 (2 * 5 * 6)

در این مثال یک تابع product() داریم که یه آرگومان می گیرد و حاصل ضرب آنها را برمی گرداند. سپس تابع doubleProduct() با فراخوانی bind() روی product() اولین آرگومان را بصورت 2 ثابت ارسال می کند. و این باعث می شود دو آرگان بعدی را بعدا ارسال و حاصل ضرب آنها را برگرداند.