lexical scope فى جافاسكربت


السلام عليكم و رحمه الله تعالى و بركاته

جافاسكربت لغه lexically scoped معنى ذلك ان الوظائف تؤدى عملها فى ال scope الذى تم تعريفها فيه لا التى تم تشغيلها – استدعائها – منه .

Javascript is also lexically scoped , which means that functions run in the scope they are defined in, not the scope they are executed in .
— Pro JavaScript Design Patterns book

معنى ذلك انه اذا تم تعريف وظيفه فى scope اول و تم استخدامها فى scope اخر فإنها تستطيع إستخدام متغيرات ال scope الاول حتى اذا كانت متغيرات خاصه خارج هذا ال scope ، انظر المثال البسيط التالى :

var baz;

(function(){
    var foo = 10; // private variable
    var bar = 5; // private variable
    baz = function(){
        return foo*bar;
    }
})();

alert(foo); // undefined
alert(bar); // undefined
baz(); // 50

فى المثال السابق قمت بعمل self invoking anonymous function وظيفه مجهوله يتم تنفيذها تلقائيا ، و بذلك اعطيت للمتغيرات داخلها closure يحميها من ال global scope و بذلك لا يمكن استخدام foo و bar من global scope ، و قمت بتعريف الوظيفه baz التى تقوم بإرجاع كل من foo و bar ، لكن عندما اقوم بإستدعاء baz من global scope فإنه يستطيع استخدام bar و baz لأنه تم تعريفه فى نفس ال scope الذى تم تعريفهم فيه ، بالرغم انه تم استدعاء baz من scope لا يرى bar و foo ، و المثال السابق يوضح مفهوم ال lexical scope ان الوظيفه تؤدى عملها فى ال scope التى تم تعريفها فيه لا التى تم تشغيلها منه .

حتى نرسخ مفهوم ال lexical scope فى ذهنك انظر المثال البسيط التالى :

var baz;

(function(){
    var foo = 10; // private variable
    var bar = 5; // private variable
    baz = function(){
        return foo*bar;
    }
})();

function testLexicalScope(){
    var foo = 9;
    var bar = 8;
    alert(baz());
}

testLexicalScope(); // 50

قمت بعمل وظيفه جديده إسمها testLexicalScope قمت بعمل متغيرين لا يمكن استخدامها خارج هذه الوظيفه بإسم foo و bar ، تعمدت استخدام نفس اسم المتغيرات التى داخل الوظيفه المجهوله التى يتم تنفيذها تلقائيا حتى اعرف اى foo و bar ستستخدمهم الوظيفه baz ، و كانت المفاجئه ان baz قام بإستخدام foo و bar التى داخل الوظيفه المجهوله ، لماذا ؟ لأن جافاسكربت lexically scoped الوظائف تؤدى عملها فى ال scope الذى يتم تعريفها فيه لا الذى يتم استدعائها منه .

الأوسمة:

4 تعليقات to “lexical scope فى جافاسكربت”

  1. Omar Al-Dolaimy Says:

    حركة جميلة🙂 ^^
    أتوقع php تعمل العكس! يعني تتبع المكان الذي تنفذ به صحيح؟؟

  2. almhajer Says:

    اول شي شكرا جزيلا على المواضيع المتقدمة والله يبارك فيك
    طبعا لو جينا حللنا عمليلا فان السكوب في هذا المقال كله عام بالنسبة للعناصر anonymous function واعضائه اي ال anonymous هو يعتبر بمثابة object او namespace فكل من يكون ضمن لوائه يمكنه استخدام اعضائه حتى ولو متغيرات خاصة لانه ضمن النطاق
    شكرا جزيلا واتمنى شرح مفصل ل call و apply وبارك الله فيك وتحياتي للجميع

  3. mostafa farghaly Says:

    @ عمر : مش متأكد الصراحه من php هل هى lexically scoped ام لا .

    @ المهاجر : الشكر لله و ان شاء الله سأبدأ فى كتابه موضوع عن call و apply بعد قليل ، يعجبنى كثيرا فهمك للأمور و مناقشتك ، استمر .

  4. almhajer Says:

    بارك لله فيك وشكرا جزيلا

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s


%d مدونون معجبون بهذه: