PDA

View Full Version : وضعیت متغییر ها در جاوا اسکریپت



funpatogh
یک شنبه 28 شهریور 1389, 00:04 صبح
سلام
این مثال رو ببینید


<html>
<head>
<script type="text/javascript">
i=1;
function add()
{
input='<input type"text" /><br />';
document.getElementById("at").innerHTML+='text '+i+':'+input;
i++;
}
</script>
</head>
<body>

<input type='submit' onclick='add()' value="Add">
<div id="at"></div>
</body>
</html>


با هر بار کلیک یک تکست باکس ایجاد میشود
ما که متغییر i رو سراسری تعریف کردیم و بیرون از فانکشن چرا توی فانکشن راحت میشه متغییر i رو دستکاری کرد
یعنی می خوام بدونم توی این زبان حوزه محلی و سراسری نداریم؟
چرا توی همون فانکشن متغییر i رو تعریف نکردیم
یکم توضیح بدهید که چه موقع بیرون از فانکشن یک متغییر رو تعریف میکنیم
چیزی که من فهمیدم بیرون از فانکشن متغییر استاتیک شده و مقدار رو هر بار که زیاد کردیم توی خودش نگه داشته

Hell Lord
یک شنبه 28 شهریور 1389, 07:00 صبح
خارج از سوال شما این را توضیح میدهم شاید جواب سوال شما هم داده شد :
زمانی که شما یک متغیر را توسط var در خارج از function تعریف کنید، آن متغیر سراسری است، حال اگر با var متغیری با همان نام داخل function تعریف کنید، زمان فراخوانی ، آن متغیر، متغیری است که در داخل function تعریف شده است.
بهتر بگویم :

<script type="text/javascript">
var i=1;
function add()
{
input='<input type"text" /><br />';
document.getElementById("at").innerHTML+='text '+i+':'+input;
i++;
}
</script>در حالت بالا، مقدار اولیه ی i همان 1 است که در بیرون (و به حالت سراسری) تعریف شده است.
اما اگر کد به صورت زیر شود :

<script type="text/javascript">
var i=1;
function add()
{
var i = 5;
input='<input type"text" /><br />';
document.getElementById("at").innerHTML+='text '+i+':'+input;
i++;
}
alert(i);
</script>مقدار اولیه i پنج میشود و اگر خارج از function مقدار i را دریافت کنید، 1 را به شما نمایش خواهد داد.

funpatogh
سه شنبه 30 شهریور 1389, 23:58 عصر
خوب اگه این شکلی کنیم مثال رو چی؟


<script type="text/javascript">
i=2;
function add()
{
input='<input type"text" /><br />';
document.getElementById("at").innerHTML+='text '+i+':'+input;
i++;
}
</script>

اینجا مقدار اولیه i 2 میشه ما که سراسری تعریف کردیم و توی فانکشن هم چیزی به این نام تعریف نکردیم
پس چرا از بیرون فانکشن مقدار i خوانده شده؟

هر بار که فانکشن اجرا شده i یکی زیاد شده و دفعه بعد که صدا زده شده مقدار قبلش رو داشته
بیرون از فانکشن که تعریف میشه این خاصیت استاتیک بودن رو داره؟

Hell Lord
چهارشنبه 31 شهریور 1389, 10:43 صبح
زمانی که خارج از فانکشن متغیر تعریف میکنید، آن متغیر سراسری در نظر گرفته میشود.
شما الان داخل فانکشن متغیری تعریف نکرده اید... دارید دستور میدهید که به مقدار i یکی اضاف کند، که i هم همان متغیر خارجی است.

فکر کنم منظورتان را فهمیدم، یعنی شما میخواهید متغیری خارج از فانکشن تعریف کنید که داخل فانکشن ها دسترسی نداشته باشد؟
فکر نکنم همچین حالتی در جاوا اسکریپت باشد.

funpatogh
چهارشنبه 31 شهریور 1389, 21:23 عصر
عزیز من php کار هستم و جاوا اسکریپت و php و c و ... همه شبیه به هم هستند
اما خوب چون جاوا زیاد کار نکردم برام این سوال پیش آمد
اخه توی php وقتی یک متغییر سراسری تعریف میشه توی فانکشن باید حتما global کنیم تا بشه از توی فانکشن یک متغییر بیرونی رو تغییر بدهیم اگر هم گلوبال نکنیم و توی فانکشن متغییر به این نام هم ایجاد کنیم ربطی به متغییر بیرون از فانکشن نداره
اما توی جاوا انگار یکمی فرق داره
متغییر بیرون که تعریف کنیم توی فانکشن اگر متغییری همنام نباشه از بیرون استفاده میکنه و اگر همنام باشه از داخل درسته؟
حالا اگر هم بیرون از فانکشن باشه و هم درون فانکشن باشه و بخواهیم توی فانکشن مقدار بیرونی رو تغییر بدهیم چه کار باید کرد؟

Hell Lord
پنج شنبه 01 مهر 1389, 09:59 صبح
عزیز من php کار هستم و جاوا اسکریپت و php و c و ... همه شبیه به هم هستند
اما خوب چون جاوا زیاد کار نکردم برام این سوال پیش آمد
اخه توی php وقتی یک متغییر سراسری تعریف میشه توی فانکشن باید حتما global کنیم تا بشه از توی فانکشن یک متغییر بیرونی رو تغییر بدهیم اگر هم گلوبال نکنیم و توی فانکشن متغییر به این نام هم ایجاد کنیم ربطی به متغییر بیرون از فانکشن نداره
اما توی جاوا انگار یکمی فرق داره
متغییر بیرون که تعریف کنیم توی فانکشن اگر متغییری همنام نباشه از بیرون استفاده میکنه و اگر همنام باشه از داخل درسته؟
حالا اگر هم بیرون از فانکشن باشه و هم درون فانکشن باشه و بخواهیم توی فانکشن مقدار بیرونی رو تغییر بدهیم چه کار باید کرد؟
متوجه هستم عزیز که شما برنامه نویس ماهری هستید، بنده چیزی نگفتم که!؟


متغییر بیرون که تعریف کنیم توی فانکشن اگر متغییری همنام نباشه از بیرون استفاده میکنه و اگر همنام باشه از داخل درسته؟
بله درست است.اگر همنام باشد و داخل عملگر دوباره تعریف نشده باشد، همان متغیر خارجی را در نظر میگیرد.
اما اگر از var برای تعریف آن متغیر(همنام) در داخل عملگر استفاده کنید،هنگامی که داخل عملگر هستید، تنها متغیر داخلی را در نظر میگیرد و به متغیر خارجی دسترسی ندارید.
دیگه بیشتر از این نمیدونم :خجالت: اساتید انشالله میان جواب میدن.

eAmin
پنج شنبه 01 مهر 1389, 12:14 عصر
متغییر بیرون که تعریف کنیم توی فانکشن اگر متغییری همنام نباشه از بیرون استفاده میکنه و اگر همنام باشه از داخل درسته؟
حالا اگر هم بیرون از فانکشن باشه و هم درون فانکشن باشه و بخواهیم توی فانکشن مقدار بیرونی رو تغییر بدهیم چه کار باید کرد؟
سلام
اگر از همون اول سوالتون رو اینطور مطرح کرده بودید، شاید زودتر به جواب می رسیدید!
در هرصورت این مثال به اندازه ی کافی گویا هست و نیازی به توضیح فکر نمی کنم داشته باشه:
var i = 'Amin';

function aaa() {
var i = 'You';
alert(i);
alert(window.i)
window.i = 'Me';
alert(window.i);
}

aaa();




اینجا مقدار اولیه i 2 میشه ما که سراسری تعریف کردیم و توی فانکشن هم چیزی به این نام تعریف نکردیم
پس چرا از بیرون فانکشن مقدار i خوانده شده؟



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

بله این دو با هم فرق دارن، در JavaScript وقتی یک متغیر رو بصورت Global تعریف می کنید، شما می تونید در سراسر کدهاتون شما به اون متغیر دسترسی داشته باشید. تازمانی که متغیر همنامی در تابع یا متدی تعریف نکرده باشید. توضیحاتی که جناب Hell Lord هم داده بودن کاملا درست بوده و هست.
کلا شما اگر بتونید مبحث Scope در JavaScript درک کنید تازه به قدرت جاوااسکریپت پی می برید!:لبخندساده:

موفق باشید.

Hell Lord
پنج شنبه 01 مهر 1389, 12:27 عصر
سلام
اگر از همون اول سوالتون رو اینطور مطرح کرده بودید، شاید زودتر به جواب می رسیدید!
در هرصورت این مثال به اندازه ی کافی گویا هست و نیازی به توضیح فکر نمی کنم داشته باشه:
var i = 'Amin';

function aaa() {
var i = 'You';
alert(i);
alert(window.i)
window.i = 'Me';
alert(window.i);
}

aaa();

موفق باشید.
:تشویق:
متوجه window نبودم :اشتباه::خجالت:

funpatogh
پنج شنبه 01 مهر 1389, 20:49 عصر
بنده قدرت جاوا رو کنار برنامه های خودم حس کردم و ترکیبش با php واقعا برام دلچسب شده اما خوب نکته های ریز و کلیدیش رو هنوز نمی دانم اما خوب زبان شیرینی هست
از هر دو عزیز ممنون