منبع اصلی نوشتار زیر در این لینک قرار دارد

بازی با جاوااسکریپت و معرفی یک سایت

اگر از بازیهای اولیه و افکت های jQuery خارج شیم و به اصل جاوااسکریپت برسیم می فهمیم که اصلا زبان برنامه نویسی راحتی نیست!حداقل برای کسانی که با بقیه زبان های برنامه نویسی مخصوصا شی گرا برنامه نویسی کرده باشند این نکته خیلی قابل درک هست.اصولا هیچ چیزی در جاوااسکریپت سر جای خودش نیست و به نظر من تمیز کد زدن در جاوااسکریپت یک هنر واقعیه ( بر خلاف پایتون که کثیف کد زدن درونش یک هنر واقعیه )

جاوااسکریپت هیچ ساختار تعریف شده ای برای ساخت Class نداره و این خود کاربر هست که Class رو تعریف می کنه!قابلیت انعطاف فوق العاده زیاد و البته سختی های مربوط به خودش.

در جاوااسکریپت توابع Object هستند و هر تابع می تونه method ها و property های خودش رو داشته باشه!به نظرم هنوز خیلی از زوایای جاوااسکریپت برام خودم هم مخفی مونده و امیدوارم بتونم بیشتر درکش کنم.دوست داشتم بعضی از چیزهایی که از جاوااسکریپت درک کردم رو اینجا بنویسم و به مرور زمان کامل و کاملتر کنم.

undefined

وقتی داخل کنسول کروم(یوم) یا فایرفاکس یک متغیر رو تعریف می کنم undefined چاپ میشه! خوب نکته اول اینکه کروم از موتور V8 برای کدهای جاوااسکریپت استفاده می کنه،همون موتور جاوااسکریپتی که NodeJS بر روی اون نوشته شده.به طور پیش فرض تمام متغیر ها در جاوااسکریپت undefined هستند و بصورت پیش فرض وقتی تابع یا متغیری چیزی رو برنگردونه، undefined برگردانده و چاپ میشه.پس پیش فرض هر چیزی در جاوااسکریپت undefined هست مگر اینکه خلافش ثابت بشه.

if (true){}
undefined
if (true){true}
true

 

توابع Inline در جاوااسکریپت

من اولین بار در ++C با توابع Inline آشنا شدم، وقتی شما یک تابع تعریف می کنید و در جای دیگه ای از برنامه اون تابع رو صدا می زنید ، متغیر های فعلی به داخل stack ریخته میشند،آدرس برنامه عوض میشه و اون تابع اجرا میشه.خوب این اتفاق برای سیستم زمان بر است و بعضی مواقع ترجیح میدیم که در صورتی که برنامه اون تابع کوتاه باشه همون جا کپی و پیست کنیم، ولی این کار باعث کثیف ناخوانا شدن کد ما میشه.در ++C راه حل با کلمه کلیدی inline حل شد، یعنی شما تابع رو با کلمه inline تعریف می کنید و  یک جورایی کامپایلر به جای شما کد داخل اون تابع رو براتون کپی و پیست می کنه.به کد زیر در ++C نگاه کنید (منبع کد):

#include <iostream>

using namespace std;

inline int Max(int x, int y)
{
   return (x > y)? x : y;
}

// Main function for the program
int main( )
{

   cout << "Max (20,10): " << Max(20,10) << endl;
   cout << "Max (0,200): " << Max(0,200) << endl;
   cout << "Max (100,1010): " << Max(100,1010) << endl;
   return 0;
}

اما در جاوااسکریپت(مراجعه به پ.ن) به توابعی که موقع تعریف اجرا می شند و دیگه نمیشه ازشون استفاده کرد Inline میگند.یعنی عملا به مفهوم کلی تابع نیستند که قابلیت استفاده چندین باره داشته باشند و فقط یک Scope از برنامه هستند.
این توابع با قرار دادن () در آخر تعریف تابع اتفاق می افته.مثلا:

var Inline = function(){
console.log('Inline Fucntion');
}();
Inline Fucntion//output
undefined//output
Inline
undefined//output

همانطور که می بینید ما قابلیت استفاده مجدد از تابع Inline رو نداریم.

 

property و method های static در جاوااسکریپت

جاوااسکریپت مثل بقیه زبان ها ساختار مشخصی برای Class ها نداره ولی از Function ها برای تعریف کلاس استفاده میشه.مثلا کد زیر یک Class در جاوااسکریپت هست که می تونیم ازش Object های متعددی تولید کنیم.

var Class1 = function(){
	this.x = 10;
}

یکی دیگه از راه های اضافه کردن متد یا property به کلاس استفاده از prototype هست.مثل کد زیر:

var Class2 = function(){}
Class2.prototype.x = 10;

در حال حاضر ما دو تا کلاس با نامهای Class1 و Class2 داریم که یک تفاوت عمده دارند!در کلاس دوم X که با استفاده از prototype تعریف شده در عمل static است.یعنی فقط یک نمونه از روی اون موجوده.بر خلاف Class1 که به ازای در شی از کلاس یک متغیر X هم تعریف می شود.کد زیر گواه حرف من است.

var Class1 = function(){
	this.x = 10;
}

var Obj11 = new Class1();
var Obj12 = new Class1();

Obj11.x++;
console.log(Obj12.x);//10
///
var Class2 = function(){}
Class2.prototype.x = 10;

var Obj21 = new Class2();
var Obj22 = new Class2();
Obj21.x++;
console.log(Obj22.x);//11

 

 

تعریف بدون واسطه شی:

در صورتی که نیاز به تعریف یک شی داشتیم (یعنی دیگر Class نیست،عملا نمونه از یک کلاس ایجاد شده است و دیگر Class رو هم نداریم) از کلمه new قبل از function استفاده می کنیم.به کد زیر دقت کنید:

var Class3 = new function(){
	this.x = 10;
}
console.log(Class3.x);//10

در این نوع تعریف دیگر نمی توان از Class3 شی دیگری ایجاد نمود.

خواندن کتاب و مقاله و نمونه کد

من خواندن این مطلب از سایت Oreilly رو هم پیشنهاد می کنم و نکته بعدی ای که فهمیدم اینکه هیچ وقت خواندن مقاله برای یادگیری چیزی جای کتاب رو نمی گیره!شاید همین اشتباهی بوده که من انجام دادم.فکر می کنم برای شروع هرچیزی کتاب بهترین راه باشه و بعد باید رفت سراغ مقالات و نمونه کدها.

به همه دوستان یادگرفتن فریم ورک CanJS رو پیشنهاد می دم و به نظرم خیلی کارو راحت تر میکنه.(در حال حاضر من CanJS رو به BackboneJS ترجیح میدم)

پ.ن مهم: دانش من در جاوااسکریپت هنوز خیلی کامل نیست و ممکنه بعدترها متوجه بشم چیزی رو اشتباه نوشتم و دوباره این متن رو ادیت کنم.

معرفی سایت

حتما سایت Cloud9 رو ببینید . یک DIE روی وب که امکان اجرا و تست کدهاتون رو بهتون میده.به نظرم ایده خیلی فوق العاده ای بوده و teamwork رو به شدت ساده می کنه.حتما تست کنید.به نظرم من با سرعت اینترنت ایران خیلی مشکلی نداره و قابل کار هست.هرچند من هنوز IDE قدیمی خودم رو ترجیح میدم ولی این سایت هم گزینه خوبی هست.



برچسب ها : ,