Middle
სლაკონური ფუნქციები და ჩვეულებრივი ფუნქციები რა განსხვავებაა bind მეთოდის გამოყენების საჭიროების თვალსაზრისით?
sobes.tech AI
პასუხი AI-სგან
სროლა ფუნქციებს არ აქვთ საკუთარი კონტექსტი this. ისინი იჭერენ this-ს გარშემომყოფი გარემოდან (ლექსიკური გარემო).
ჩვეულებრივი ფუნქციები განსაზღვრავს თავის this-ს იმაზე დამოკიდებული, თუ როგორ არის ისინი მოწოდებული:
- გლობალურ კონტექსტში (
windowანglobal). - ობიექტის მეთოდად (
thisმიუთითებს ობიექტზე). - კონსტრუქტორად (
thisმიუთითებს ახალ მაგალითზე). - გამოყენებით
call,applyანbind(thisმკაფიოდ განსაზღვრული).
რადგან სროლა ფუნქციებს არ აქვთ საკუთარი this, bind-ის გამოძახება სროლა ფუნქციაზე არანაირ აზრს არ აქვს და ლექსიკური დაკავშირებული this-ს არ შეცვლის. როდესაც ცდილობთ bind-ის გამოძახებას სროლა ფუნქციაზე, ის უბრალოდ დააბრუნებს თავის თავს:
მაგალითი:
// ჩვეულებრივი ფუნქცია
const normalFunc = function() {
console.log(this.name);
};
const obj1 = { name: 'Object 1', method: normalFunc };
const obj2 = { name: 'Object 2' };
obj1.method(); // შედეგი: Object 1
const boundFunc = normalFunc.bind(obj2);
boundFunc(); // შედეგი: Object 2 (`this` წარმატებით შეიცვალა)
// სროლა ფუნქცია
const arrowFunc = () => {
console.log(this.name);
};
const obj3 = { name: 'Object 3' };
// ArrowFunc იჭერს `this`-ს გარშემომყოფ კონტექსტიდან (ამ შემთხვევაში, გლობალურ ობიექტს)
arrowFunc(); // შედეგი: undefined (შესაძლოა, რადგან `this` არ შეიცავს `name`-ს)
const boundArrowFunc = arrowFunc.bind(obj3);
boundArrowFunc(); // შედეგი: undefined (`this` დარჩა უცვლელი, bind-ი არ მოქმედებს)
// მაგალითი `this`-ის დაჭერით
const person = {
name: 'Alice',
greet: function() {
// აქ `this` მიუთითებს `person`-ზე
const greetLater = () => {
// აქ `this` იჭერება გარედან `greet`-დან, ანუ ასევე მიუთითებს `person`-ზე
console.log(`Hello, ${this.name}!`);
};
greetLater();
}
};
person.greet(); // შედეგი: Hello, Alice!
საბოლოოდ, bind მეთოდი აუცილებელია ჩვეულებრივი ფუნქციებისთვის, რათა მკაფიოდ განისაზღვროს მათი კონტექსტი this-ის მხრივ, ხოლო სროლა ფუნქციებისთვის ის ზედმეტია, რადგან მათი this ლექსიკურად არის განსაზღვრული და ვერ იცვლება bind-ით।