ورود

View Full Version : سوال: (function() {...})???



cyber_world
دوشنبه 14 مرداد 1387, 08:06 صبح
سلام. در يك تگ جاوا اسكريپت چنين چيزي نوشته شده بود :




(function(){
if (_isIE&&(typeof _lastCalFunc!='function'||!_checkCSS())) {
var u=window.location.href;
window.location.href=(u.indexOf('http:')==0)
? u.replace(/^http:/,'https:')
: 'http://www.google.com/support/calendar/bin/answer.py?answer=34581&' +
"hl\75en";
}
})();

لطفا راهنمايي بفرماييد كه اين چه نوع function اي است ؟!!!:متعجب:

امید امرایی
دوشنبه 14 مرداد 1387, 14:13 عصر
کد رو اینجوری بزارید که خوانا تر باشه


function(){
if (_isIE&&(typeof _lastCalFunc!='function'||!_checkCSS())) {
var u=window.location.href;
window.location.href=(u.indexOf('http:')==0)
? u.replace(/^http:/,'https:')
: 'http://www.google.com/support/calendar/bin/answer.py?answer=34581&' +
"hl\75en";
}
})();
این تابع همین جوری به صورت مجزا نیست و حتما به جایی ارسال شده
اگه دقت کنید در این پست بنده هم همین روش رو استفاده کردم http://barnamenevis.org/forum (http://barnamenevis.org/forum/showthread.php?t=116311)
/showthread.php?t=116311 (http://barnamenevis.org/forum/showthread.php?t=116311)

به عنوان مثال میتونید تعریف کنید :


window.document.onload = function(){
alert('Document Loaded')
}
ایندرست مثله اینه که اینطور بنویسید :




function sayCompleted(){
alert('Document Loaded')
}

window.document.onload = sayComleted;

cyber_world
دوشنبه 14 مرداد 1387, 14:55 عصر
از راهنمايي مفيدتون متشكرم. پس يعني اين يك تابع بدون نام هست كه خودشو فراخواني مي كنه ؟!!

در ضمن اين شكل تعريف تابع چه مزيتي داره؟

امید امرایی
دوشنبه 14 مرداد 1387, 15:17 عصر
پس يعني اين يك تابع بدون نام هست كه خودشو فراخواني مي كنه ؟!!

دقیقا درسته



اين شكل تعريف تابع چه مزيتي داره؟

گاهی به دلیل محدودیت های حوزه توابع در جاوا اسکریپت مجبور می شیم از این شکل استفاده کنیم
در بیشتر اوقات این شکل از تابع برای پاسخ گویی به رویداد ها مناسبه و استفاده می شه


window.document.onload = alert('Document Loaded');

روش بالا درسته اما اگه بخواید چند خط کد پیچیده تر اجرا بشه دیگه این روش کارامد نیست
و باید از function های به اصطلاح خودتون بی نام استفاده کنید

گذشته از این باعث کاهش حجم کد نویسی می شه

eAmin
دوشنبه 14 مرداد 1387, 19:54 عصر
سلام.

در اصل اینجوری هست:

(function(){
if (_isIE&&(typeof _lastCalFunc!='function'||!_checkCSS())) {
var u=window.location.href;
window.location.href=(u.indexOf('http:')==0)
? u.replace(/^http:/,'https:')
: 'http://www.google.com/support/calendar/bin/answer.py?answer=34581&' +
"hl\75en";
}
})();

این یک نوع تابع بی نام هست که خوب در بعضی از جاها نیاز به اینجور تابعها می شه.

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

یکی از مزیتهای این نوع نوشتن تابع این هست که شما می تونید آرگومانهاتون رو از قبل مقدار دهی کنید، به عنوان مثال این کد زیر رو یه نگاهی بندازید:

(function(aaa) {

alert(aaa);

})("eAmin");

خب خیلی واضحه...

در ضمن همونطور که kassit گفت شما می تونید از این نوع توابع بی نام هم استفاده کنید:

window.onload = function() {....};
برای اجرای رویدادها نیاز نیست که ما از توابع نام دار استفاده کنیم، ولی در هرحال اگر زمانی نیاز به اینکار داشتیم، می شه به اینصورت هم عمل کرد:

window.onload = function eve() {....};
در ضمن عین همین کار رو می شه برای روش توابع بی نام اول هم به کار برد به اینصورت:

window.onload = (function() { .... })();
در کل این نوع تابعها زمانی بدرد شما می خوره که شما، چه جور کاری بخواین انجام بدید، و در ضمن اینکار همونطور که دوست عزیزمون اشاره کرد، خیلی بهینه هست.

cyber_world
سه شنبه 15 مرداد 1387, 09:21 صبح
متشكرم.
حالا اگه بخوايم از يك تابعي در رويدادهاي ديگري هم استفاده كنيم، قاعدتا اين نوع توابع بي نام ديگه كارايي نخواهند داشت، درسته ؟! خب ، حالا اگه اين كه گفتم درست باشه، پس چطور اين توابع حجم كدنويسي رو كاهش ميدن؟؟!!!:گیج:

eAmin
سه شنبه 15 مرداد 1387, 11:49 صبح
متشكرم.
حالا اگه بخوايم از يك تابعي در رويدادهاي ديگري هم استفاده كنيم، قاعدتا اين نوع توابع بي نام ديگه كارايي نخواهند داشت، درسته ؟! خب ، حالا اگه اين كه گفتم درست باشه، پس چطور اين توابع حجم كدنويسي رو كاهش ميدن؟؟!!!:گیج:

سلام.

بله.

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

به این قسمت بیشتر توجه کنید، منظور از اینکار تمام راهکارهایی بود که معرفی کردیم!

مثلا ببنید، این کد جوابگوی شما هست و برای رویدادهای دیگه هم کاربرد داره...


window.onload = function eve() {....};

حالا به این کد دقت کنید:

function eee() {
alert("eAmin");
};

eee();

می بنید که باید اسم تابع رو بیاریم تا اجرا بشه، در صورتی که در روش توابع بی نام اینطور نیست.

امید امرایی
سه شنبه 15 مرداد 1387, 14:03 عصر
از توابع بی نام جاوا اسکریپت می شه مثل بدنه های Static جاوا استفاده کرد


چطور اين توابع حجم كدنويسي رو كاهش ميدن؟؟!!!

کاهش حجم تنها یکی از مزیت ها بود و هیچ چیز هم مطلق نیست نکته مهمتر اینه که دقت کنید :


گاهی به دلیل محدودیت های حوزه توابع در جاوا اسکریپت مجبور می شیم از این شکل استفاده کنیم

اگر سعی کرده باشید جاوا اسکریپت رو Objective کار کنید بهتر متوجه منظور بنده می شید