javascript - معلم - شرح جافا سكربت بالعربي pdf




جافاسكريبت نطاق الخصوصية كسر؟ (2)

جميع المتغيرات المحلية في جافاسكريبت لها نطاق وظيفة وليس نطاق الكتلة ( أتليست قبل ECMAScript 2015 ). وهو ما يعني أن المتغيرات المعلنة داخل الوظيفة، وهي متاحة لوظيفة كاملة.

ما كنت تشير هو كتلة النطاق. لسوء الحظ نطاق نوبلوك في جافا سكريبت حتى ECMA2015 . من ECMAScript 2015 ، يمكنك أن تعلن المتغيرات الخاصة بك مع let التي يمكن أن يشار فقط في كتلة ويموت بمجرد الخروج من تلك الكتلة.

مستندات مدن تقول (مع أمثلة)

قواعد تحديد النطاق

مع فار

المتغيرات المعلنة مع فار لا تملك نطاق الكتلة. يتم تحديد المتغيرات التي يتم إدخالها مع كتلة إلى الدالة المحتوية أو النص البرمجي، وتظل آثار تحديدها خارج الكتلة نفسها. وبعبارة أخرى، لا تعبر عبارات الكتلة عن نطاق. على الرغم من أن كتل "مستقل" هي بنية صحيحة، لا تريد استخدام كتل مستقلة في جافا سكريبت، لأنها لا تفعل ما تعتقد أنها تفعل، إذا كنت تعتقد أنها تفعل أي شيء مثل هذه كتل في C أو جافا. إلى عن على

example:

var x = 1;
{
  var x = 2;
}
console.log(x); // logs 2

هذا السجل 2 لأن عبارة فار x داخل الكتلة في نفس نطاق بيان فار x قبل الكتلة. في C أو جافا، فإن الكود المكافئ كان سينتج 1.

مع السماح والثابت

على النقيض من ذلك، المعرفات المعلنة مع السماح و كونست لديها نطاق كتلة:

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
The x = 2 is limited in scope to the block in which it was defined.

لذلك جئت عبر شيء غريب جدا أثناء العمل على مشروع جافا سكريبت الآن وهنا مثال المغلي على الوضع أنا الخلط حول:

function doSomething() {
    for(var d = 0;d < 10;d++) {
        var shouldBePrivate = 5;
    }

    for(var d = 0;d < 10;d++) {
        console.log(shouldBePrivate);
    }
}

عند استدعاء دوزوميثينغ () يجب أن يكون المتغيرباريفات الخاص في 2 ل حلقة.

ألا ينبغي أن لا يكون ذلك ممكنا؟


كنت قد تعثرت على شيء يسمى رفع. لأن جميع المتغيرات يتم تحديدها إلى الدالة المحتوية عليها، يتم نقل بيانات var داخليا إلى أعلى الدالة.

وهذا يعني أن المترجم سيقوم فعلا بتشغيل هذا الرمز:

function doSomething() {
    var shouldBePrivate;
    var d;
    for(d = 0;d < 10;d++) {
        shouldBePrivate = 5;
    }

    for(d = 0;d < 10;d++) {
        // now it's easy to see why this works
        console.log(shouldBePrivate);
    }
}

اعتبارا من ES2015، يمكنك استخدام الكلمة let بدلا من var الذي هو نطاق معجمي - أي نطاق داخل كتل، وهذا يعني أن let shouldBePrivate = 5; لن تكون موجودة خارج الحلقة الأولى.

function doSomething() {
    for(let d = 0;d < 10;d++) {
        let shouldBePrivate = 5;
    }

    for(let d = 0;d < 10;d++) {
        // Reference Error for shouldBePrivate 
        console.log(shouldBePrivate);
    }
}




scope