بررسی سینتکس
خروجی کد زیر چیست؟
let user = {
name: "John",
go: function() { alert(this.name) }
}
(user.go)()
نکته: سوال دام دار است (یعنی نکته دارد) :)
خطا!
کد زیر را مدنظر داشته باشید:
let user = {
name: "John",
go: function() { alert(this.name) }
}
(user.go)() // خطا دارد!
پیام خطا در بیشتر مرورگر ها اطلاعاتی بابت اینکه چه اشتباهی رخ داده است نمیدهد.
** این خطا نشان داده میشود چون سمیکالن بعد از این دستور فراموش شده است {...} = user
.**
جاوااسکریپت به صورت پیش فرض سمیکالن را در براکت قبل از دستور ()(user.go)
اضافه نمیکند. سپس کد به این صورت خوانده میشود:
let user = { go:... }(user.go)()
بنابراین جاوااسکریپت حدس میزند که ما درواقع آبجکت { ... :go }
را به عنوان یک تابع با آرگومان های (user.go)
صدا زده ایم. و سپس چون به let user
میرسیم آبجکت user
به صورت تعریف نشده معرفی میشود و ما ارور را مشاهده میکنیم.
در کد زیر همه چیز خوب بنظر میرسد اگر سمیکالن را انتهای آبجکت اضافه کنیم:
let user = {
name: "John",
go: function() { alert(this.name) }
};
(user.go)() // John
توجه داشته باشید که پرانتز اطراف (user.go)
کاری انجام نمیدهد. معمولا در اکثر موقعیت ها اولویت پرانتز عملگر هارا تغییر میدهد, اما در اینجا فقط عملگر نقطه .
کار میکند. سپس مورد خاصی نیست و فعلا بحث سمیکالن مهم است.