بازگشت به درس

بررسی سینتکس

اهمیت: 2

خروجی کد زیر چیست؟

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