بررسی سینتکس
خروجی کد زیر چیست؟
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) کاری انجام نمیدهد. معمولا در اکثر موقعیت ها اولویت پرانتز عملگر هارا تغییر میدهد, اما در اینجا فقط عملگر نقطه . کار میکند. سپس مورد خاصی نیست و فعلا بحث سمیکالن مهم است.