استفاده از "this" در شیء لیترال
در اینجا تابع makeUser
یک شیء را برمیگرداند.
نتیجه دسترسی داشتن به ref
چیست؟ چرا؟
function makeUser() {
return {
name: "John",
ref: this
};
}
let user = makeUser();
alert( user.ref.name ); // نتیجه چیست؟
جواب: یک ارور
آن را امتحان کنید:
function makeUser() {
return {
name: "John",
ref: this
};
}
let user = makeUser();
alert( user.ref.name ); // Error: Cannot read property 'name' of undefined
دلیلش این است که قواعدی که this
را تشکیل میدهند به تعریف شیء نگاه نمیکنند. فقط لحظهی صدازدن مهم است.
اینجا مقدار this
درون makeUser()
برابر با undefined
است، چون به عنوان تابع صدا زده شده است نه به عنوان یک متد با سینتکس نقطه.
مقدار this
برای تمام تابع یکی است و بلوکهای کد و شیءهای لیترال روی آن تاثیری نمیگذارند.
بنابراین ref: this
در واقع this
کنونی تابع را میگیرد.
ما میتوانیم تابع را بازنویسی کنیم و this
یکسان را با مقدار undefined
برگردانیم:
function makeUser(){
return this; // این بار هیچ شیء لیترالی وجود ندارد
}
alert( makeUser().name ); // Error: Cannot read property 'name' of undefined
همانطور که میبینید نتیجه alert( makeUser().name )
با نتیجه alert( user.ref.name )
از مثال قبل یکسان است.
کد پایین متضاد قبلی است:
function makeUser() {
return {
name: "John",
ref() {
return this;
}
};
}
let user = makeUser();
alert( user.ref().name ); // John
حالا کار میکند، چون user.ref()
یک متد است. مقدار this
برابر با شیء قبل از نقطه .
است.