?what is the difference between block level scope and function level scope

سلام به همگی.. داشتم جاوا اسکریپت کار میکردم که خوردم به بحث scope  ویکم مشکل پیدا کردم.اینکه میگن جاوااسکریپت function level scope هستش رو فهمیدم ولی block level scope هرچقد مثال زدن بازم نفهمیدم که چه فرقی با function level scope داره؟خب جفتشونم از local variable و global variable  استفاده میکنن وسطح دسترسیم بهشون یه جور....حالا تفاوت دقیقا توی چیه؟اگه با ذکر مثال توضیح بدید واقعا ممنون میشم. با تشکر

پاسخ ها

sokanacademy forum
کاربر سکان آکادمی 8 سال پیش

سلام،اول شما باید تعریف و تفاوت فانکشن وبلاک را بدانید فانکشن که

function general(){}

بلاک هم بین دو تا براکت {}یک بلاک خوانده می شود.

if (){}

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

function foo() {
    console.log('before block: ' + bar);      // prints 'undefined'
    if(true) {
        var bar = 1;
        console.log('inside block: ' + bar);  // prints 1
    }
    console.log('outisde block: ' + bar);     // prints 1
}

کد بالا ران کنید داخل کنسول مرورگر ببنید متغییر خارج بلاک اما داخل تابع قابل چاپ شدن است...

خوب دیدید کد بالا دقیقا معادل این کد می باشد.......

function foo() {
    var bar;
    console.log('before block: ' + bar);      // prints 'undefined'
    if(true) {
        bar = 1;
        console.log('inside block: ' + bar);  // prints 1
    }
    console.log('outisde block: ' + bar);     // prints 1
}

این کد hoisting کد بالا گفته می شود.پس بهتره از این به بعد متغیر را اول تابع و اصطلاحا به صورت hoisting بنویسیم...این کلمه به معنی بالا کشیدن است

اما زبلن مثل  سی ++ یا سی شارپ بلاک لول هستند یعنی جه؟؟؟؟؟

کد زیر نگا کن متغیر داخل یک بلاک تعریف کرده است:

public void Foo() {
    if(true) {
        var foo = 1;
        Console.WriteLine("inside block: " + foo);
    }
    Console.WriteLine("outside block: " + foo);  // WILL NOT COMPILE
}

خروجی ارر خواهد داد

حالا اگه کد زیر را تعریف کنی

public void Foo() {
    var foo = 1;
    if(true) {
        foo = 2;
        Console.WriteLine("inside block: " + foo);  // prints 2
    }
    Console.WriteLine("outside block: " + foo);     // prints 2
}

اررر نخواهد داد

sokanacademy forum
کاربر سکان آکادمی 8 سال پیش

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

//define two variables: foo and bar
with({ foo: 1, bar: 2 }){
    alert(foo);   //1
    alert(bar);   //2
}
alert(foo);   //Error!

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

مبحث closure واین لینک هم نگاهی بندازی بد نیست

http://www.w3schools.com/js/js_function_closures.asp

sokanacademy forum
کاربر سکان آکادمی 8 سال پیش
ممنون بابت توضیحات کاملتون.
online-support-icon