this شی (Object this)
«this جاوااسکریپت» یعنی اشاره گر به یک شی. این شی بسته به محلِ صدا زدن تغییر می کند. مثل «من» که در کلاس، خانه، یا بازی، آدم های متفاوتی است.
this در متد شی
وقتی متد یک شی را صدا می زنی، this همان شی است.
const person = {
firstName: "John",
lastName: "Doe",
id: 5566,
fullName: function() {
return this.firstName + " " + this.lastName;
}
};
اتصال متد شی (Object Method Binding)
برگشتن this درون متد، خود شی را می دهد.
const person = {
firstName: "John",
lastName: "Doe",
id: 5566,
myFunction: function() {
return this;
}
};
const person = {
firstName: "John",
lastName: "Doe",
id: 5566,
fullName: function() {
return this.firstName + " " + this.lastName;
}
};
اتصال صریح تابع (Explicit Binding)
با call() و apply() می توانی this را مشخص کنی.
const person1 = {
fullName: function() {
return this.firstName + " " + this.lastName;
}
};
const person2 = {
firstName: "John",
lastName: "Doe"
};
person1.fullName.call(person2);
وام گرفتن متد با bind()
با bind() متد را می بندی تا همیشه به شیِ دلخواه اشاره کند.
const person = {
firstName: "John",
lastName: "Doe",
fullName: function() {
return this.firstName + " " + this.lastName;
}
};
const member = {
firstName: "Hege",
lastName: "Nilsen"
};
const fullName = person.fullName.bind(member);
اولویت this
ترتیب تشخیص this معمولا این است:
- اگر
bind()بود، همان شیِ بایند شده است. - اگر
call()یاapply()بود، شیِ آرگومان است. - اگر متد شی بود، همان شی است.
- اگر تابع سراسری بود، شی سراسری یا
undefinedدر strict.
نکته: this «متغیر» نیست؛ «کلیدواژه» است و خودش تغییر نمی کند.
گام های تمرینی
- یک متد بساز که
thisرا لاگ کند. - همان متد را با
call()روی شی دیگر اجرا کن. - متد را با
bind()ببند و درsetTimeoutصدا بزن.
بیشتر بخوان: this جاوااسکریپت، bind، و سازنده ها.
جمع بندی سریع
thisدر متد، خود شی است.call/apply،thisرا تعیین می کنند.bind،thisرا قفل می کند.- در strict، داخل تابع عادی،
thisبرابرundefinedاست.