variables العمليات - ما هو نطاق المتغيرات في JavaScript؟




الحسابية تعلم (21)

ما هو نطاق المتغيرات في javascript؟ هل لديهم نفس النطاق داخل وخارج وظيفة؟ أو هل يهمك الأمر حتى؟ أيضا ، أين يتم تخزين المتغيرات إذا تم تعريفها على الصعيد العالمي؟


Answers

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

عنصر في سلسلة النطاق هو في الأساس خريطة بها مؤشر إلى نطاقها الأصلي.

عند حل متغير ، يبدأ javascript في النطاق الأعمق ويبحث في الخارج.


ECMAScript 6 introduced the let and const keywords. These keywords can be used in place of the var keyword. Contrary to the var keyword, the let and const keywords support the declaration of local scope inside block statements.

var x = 10
let y = 10
const z = 10
{
  x = 20
  let y = 20
  const z = 20
  {
    x = 30
    // x is in the global scope because of the 'var' keyword
    let y = 30
    // y is in the local scope because of the 'let' keyword
    const z = 30
    // z is in the local scope because of the 'const' keyword
    console.log(x) // 30
    console.log(y) // 30
    console.log(z) // 30
  }
  console.log(x) // 30
  console.log(y) // 20
  console.log(z) // 20
}

console.log(x) // 30
console.log(y) // 10
console.log(z) // 10

1) هناك نطاق عالمي ، نطاق وظيفي ، ونطاقات مع والتقاط. لا يوجد نطاق مستوى "كتلة" بشكل عام للمتغير - مع وبيانات الصيد إضافة أسماء إلى كتل الخاصة بهم.

2) يتم تداخل النطاقات عن طريق الوظائف على طول الطريق إلى النطاق العالمي.

3) يتم حل خصائص من خلال الانتقال من خلال سلسلة النموذج الأولي. مع بيان يحمل أسماء خصائص الكائن في نطاق معجمية يحددها مع كتلة.

EDIT: ECMAAScript 6 (Harmony) محدد لدعم السماح ، وأعرف أن chrome يسمح بعلامة "التناغم" ، لذلك ربما يدعمها.

دعنا نؤيد عملية تحديد مستوى الكتلة ، ولكن عليك استخدام الكلمة الأساسية لتحقيق ذلك.

تعديل: استنادًا إلى إشارة بنيامين إلى العبارات والتعليقات في التعليقات ، قمت بتعديل المشاركة ، وقمت بإضافة المزيد. كل من مع وبيانات الصيد إدخال المتغيرات في كتل كل منهما ، وهذا هو نطاق كتلة. هذه المتغيرات هي مستعارة لخصائص الكائنات التي تم تمريرها إليها.

 //chrome (v8)

 var a = { 'test1':'test1val' }
 test1   // error not defined
 with (a) { var test1 = 'replaced' }
 test1   // undefined
 a       // a.test1 = 'replaced'

تحرير: توضيح مثال:

يتم تحديد نطاق test1 مع الكتلة ، ولكنه مستعار إلى a.test1. يخلق 'اختبار فار 1' اختبارًا متغيرًا جديدًا 1 في السياق المفاهيمي العلوي (وظيفة ، أو عالمي) ، ما لم تكن خاصية a - وهي.

ييكيس! كن حذرًا باستخدام "مع" - تمامًا كما هو var ، إذا كان المتغير مُعرَّفًا مسبقًا في الدالة ، فهو أيضًا عبارة عن نوبة فيما يتعلق بالأسماء المستوردة من الكائن! القليل من الرؤى على الاسم الذي تم تعريفه بالفعل سيجعل هذا أكثر أمانًا. أنا شخصيا لن تستخدم أبدا بسبب هذا.


In JavaScript there are two types of scope:

  • Local scope
  • Global scope

The Below function has a local scope variable carName . And this variable is not accessible from outside of the function.

function myFunction() {
    var carName = "Volvo";
    alert(carName);
    // code here can use carName
}

The Below Class has a Global scope variable carName . And this variable is accessible from everywhere in the class.

class {

    var carName = " Volvo";

    // code here can use carName

    function myFunction() {
        alert(carName);
        // code here can use carName 
    }
}

In EcmaScript5, there are mainly two scopes, local scope and global scope but in EcmaScript6 we have mainly three scopes, local scope, global scope and a new scope called block scope .

Example of block scope is :-

for ( let i = 0; i < 10; i++)
{
 statement1...
statement2...// inside this scope we can access the value of i, if we want to access the value of i outside for loop it will give undefined.
}

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

جرب الميزة على:

شاهد عرضًا على:

عرض الكود في:

تقدم الميزة حاليًا الدعم لعمق 16 وظيفة متداخلة ، لكنها لا تلون حاليًا المتغيرات العامة.


توجد نطاقات دالة فقط في JS. لا كتلة النطاقات! يمكنك أن ترى ما هو الرفع أيضا.

var global_variable = "global_variable";
var hoisting_variable = "global_hoist";

// Global variables printed
console.log("global_scope: - global_variable: " + global_variable);
console.log("global_scope: - hoisting_variable: " + hoisting_variable);

if (true) {
    // The variable block will be global, on true condition.
    var block = "block";
}
console.log("global_scope: - block: " + block);

function local_function() {
    var local_variable = "local_variable";
    console.log("local_scope: - local_variable: " + local_variable);
    console.log("local_scope: - global_variable: " + global_variable);
    console.log("local_scope: - block: " + block);
    // The hoisting_variable is undefined at the moment.
    console.log("local_scope: - hoisting_variable: " + hoisting_variable);

    var hoisting_variable = "local_hoist";
    // The hoisting_variable is now set as a local one.
    console.log("local_scope: - hoisting_variable: " + hoisting_variable);
}

local_function();

// No variable in a separate function is visible into the global scope.
console.log("global_scope: - local_variable: " + local_variable);

النطاق العالمي :

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

//global variable
var a = 2;

//global function
function b(){
   console.log(a);  //access global variable
}

النطاق المحلي:

إذا كنت في الولايات المتحدة الأمريكية ، قد تعرف كيم كارداشيان ، المشاهير المشهورين (أنها تمكنت بطريقة ما من جعل صحف التابلويد). لكن الناس خارج الولايات المتحدة الأمريكية لن يعترفوا بها. إنها نجمة محلية ، متجهة إلى أراضيها.

المتغيرات المحلية هي مثل النجوم المحلية. يمكنك الوصول إليها فقط (الحصول على أو تعيين القيمة) داخل النطاق. تعتبر الوظيفة المحلية مثل الأحداث المحلية - يمكنك تنفيذ (الاحتفال) داخل هذا النطاق فقط. إذا كنت ترغب في الوصول إليها من خارج النطاق ، فستتلقى خطأ مرجعيًا

function b(){
   var d = 21; //local variable
   console.log(d);

   function dog(){  console.log(a); }
     dog(); //execute local function
}

 console.log(d); //ReferenceError: dddddd is not defined    

تحقق من هذه المقالة لفهم متعمق للنطاق


Try this curious example. In the example below if a were a numeric initialized at 0, you'd see 0 and then 1. Except a is an object and javascript will pass f1 a pointer of a rather than a copy of it. The result is that you get the same alert both times.

var a = new Date();
function f1(b)
{
    b.setDate(b.getDate()+1);
    alert(b.getDate());
}
f1(a);
alert(a.getDate());

كل جزء من شفرة جافا سكريبت (رمز أو وظائف عالمية) له سلسلة نطاق مرتبطة به. سلسلة النطاق هذه هي قائمة أو سلسلة من الكائنات التي تحدد المتغيرات "في النطاق" لهذا الرمز. عندما يحتاج JavaScript إلى البحث عن قيمة المتغير x (عملية تسمى دقة المتغير ) ، فإنه يبدأ بالنظر إلى الكائن الأول في السلسلة. إذا كان لهذا الكائن خاصية تسمى x ، يتم استخدام قيمة هذه الخاصية. إذا كان الكائن الأول لا يحتوي على خاصية باسم x ، يستمر JavaScript في البحث باستخدام الكائن التالي في السلسلة. إذا كان الكائن الثاني لا يحتوي على خاصية باسم x ، ينتقل البحث إلى الكائن التالي ، وهكذا. إذا كانت x ليست خاصية لأي من الكائنات في سلسلة النطاق ، فإن x ليس في نطاق ذلك الرمز ، ويحدث ReferenceError. في شفرة جافا سكريبت ذات المستوى الأعلى (أي رمز غير موجود في أي تعريفات دالة) ، تتكون سلسلة النطاق من كائن واحد ، الكائن العام. في دالة غير متداخلة ، تتكون سلسلة النطاق من كائنين. الأول هو الكائن الذي يحدد معلمات الدالة والمتغيرات المحلية ، والثاني هو الكائن العام. في دالة متداخلة ، تحتوي سلسلة النطاق على ثلاثة كائنات أو أكثر. من المهم أن نفهم كيف يتم إنشاء هذه السلسلة من الكائنات. عندما تكون الدالة محددة ، فإنها تخزن سلسلة النطاق في حينها. عندما تكون هذه الدالة INKOKED ، تقوم بإنشاء كائن جديد لتخزين المتغيرات المحلية ، وتضيف ذلك الكائن الجديد إلى سلسلة النطاق المخزنة لإنشاء سلسلة جديدة أطول ، والتي تمثل نطاق استدعاء هذه الوظيفة. يصبح هذا أكثر إثارة للاهتمام للوظائف المتداخلة لأنه في كل مرة يتم استدعاء الدالة الخارجية ، يتم تعريف الوظيفة الداخلية مرة أخرى. بما أن سلسلة النطاق تختلف عن كل استدعاء للوظيفة الخارجية ، فإن الوظيفة الداخلية ستكون مختلفة بشكل رائع في كل مرة يتم تعريفها - سيكون رمز الدالة الداخلية متطابقًا عند كل استدعاء للوظيفة الخارجية ، ولكن سلسلة النطاق المرتبطة بذلك code will be different . This notion of a scope chain is crucial for understanding closures .


يوجد ALMOST نوعان فقط من نطاقات جافا سكريبت:

  • يرتبط نطاق كل تعريف var بالوظيفة الأكثر إلحاحًا على الفور
  • إذا لم تكن هناك وظيفة إرفاق لإعلان var ، فهو نطاق عالمي

لذا ، فإن أي كتل بخلاف الدالات لا تنشئ نطاقًا جديدًا. وهذا ما يفسر سبب استبدال الحلقات الفرعية للمتغيرات الخارجية.

var i = 10, v = 10;
for (var i = 0; i < 5; i++) { var v = 5; }
console.log(i, v);
// output 5 5

باستخدام وظائف بدلا من ذلك:

var i = 10, v = 10;
$.each([0, 1, 2, 3, 4], function(i) { var v = 5; });
console.log(i,v);
// output 10 10

في المثال الأول ، لم يكن هناك نطاق كتلة ، لذلك تم تجاوز المتغيرات المعلنة مبدئيًا. في المثال الثاني ، كان هناك نطاق جديد بسبب الوظيفة ، وبالتالي فإن المتغيرات المعلنة في البداية كانت SHADOWED ، ولم يتم استبدالها.

هذا هو كل ما تحتاج إلى معرفته من حيث فحص جافا سكريبت ، باستثناء:

لذلك يمكنك أن ترى أن تحديد نطاق جافا سكريبت بسيط للغاية ، على الرغم من أنه ليس دائمًا بديهيًا. بعض الأشياء التي يجب معرفتها:

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

هذا الكود

var i = 1;
function abc() {
  i = 2;
  var i = 3;
}
console.log(i);     // outputs 1

ما يعادل:

var i = 1;
function abc() {
  var i;     // var declaration moved to the top of the scope
  i = 2;
  i = 3;     // the assignment stays where it is
}
console.log(i);

قد يبدو هذا بديهيًا ، لكنه منطقي من وجهة نظر مصمم لغة إلزامي.


فقط للإضافة إلى الإجابات الأخرى ، فإن النطاق عبارة عن قائمة بحث لجميع المعرّفات (المتغيرات) المعلنة ، ويفرض مجموعة صارمة من القواعد حول كيفية الوصول إلى هذه الرموز البرمجية الحالية. قد يكون هذا البحث لأغراض تخصيص المتغير ، وهو مرجع LHS (الجانب الأيسر) ، أو قد يكون لغرض استرجاع قيمته ، وهو مرجع RHS (الجانب الأيمن). عمليات البحث هذه هي ما يفعله محرك جافا سكريبت داخليًا عند تجميع الشفرة وتنفيذها.

إذن من هذا المنظور ، أعتقد أن هناك صورة يمكن أن تساعد في العثور عليها في الكتاب الإلكتروني للنطاقات والإغلاق بواسطة Kyle Simpson:

نقلا عن كتابه يبوك:

يمثل المبنى قواعد نطاق البرنامج المتداخلة. يمثل الطابق الأول من المبنى نطاق التنفيذ الحالي ، أينما كنت. المستوى الأعلى من المبنى هو النطاق العالمي. يمكنك حل المراجع LHS و RHS من خلال النظر إلى الطابق الحالي ، وإذا لم تجده ، فاختر المصعد إلى الطابق التالي ، وتبحث فيه ، ثم التالي ، وهكذا. بمجرد الوصول إلى الطابق العلوي (النطاق العالمي) ، إما أن تجد ما تبحث عنه أو لا تفعل. ولكن عليك أن تتوقف بغض النظر.

شيء واحد من المذكرة هو الجدير بالذكر ، "توقف نطاق البحث بمجرد العثور على المباراة الأولى".

توضح هذه الفكرة لـ "مستويات النطاق" لماذا يمكن تغيير "هذا" مع نطاق تم إنشاؤه حديثًا ، إذا كان يتم البحث عنه في وظيفة متداخلة. في ما يلي رابط يدخل كل هذه التفاصيل ، كل ما تريد معرفته حول نطاق جافا سكريبت


تحتوي JavaScript على نوعين فقط من النطاق:

  1. النطاق العالمي : عالمي ليس سوى نطاق مستوى نافذة. هنا ، متغير موجود في جميع أنحاء التطبيق.
  2. النطاق الوظيفي : المتغير المعلن ضمن دالة مع الكلمة الأساسية var له نطاق وظيفي.

عندما يتم استدعاء دالة ، يتم إنشاء كائن نطاق متغير (وإدراجه في سلسلة النطاق) يتبعه متغيرات في JavaScript.

        a = "global";
         function outer(){ 
              b = "local";
              console.log(a+b); //"globallocal"
         }
outer();

سلسلة نطاق ->

  1. مستوى النافذة - a ووظيفة outer في أعلى مستوى في سلسلة النطاق.
  2. عندما تسمى الدالة الخارجية variable scope object جديد (والمضمنة في سلسلة النطاق) المضافة مع متغير b داخله.

الآن عندما يكون المتغير a مطلوبًا فإنه يبحث أولاً عن أقرب نطاق متغير وإذا كان المتغير ليس هناك من الانتقال إلى الكائن التالي لسلسلة النطاق المتغير.وهو في هذه الحالة هو مستوى النافذة.


Global: variable declared outside of a function

Local: variable declared inside a function, and can only be called in that scope


There are two types of scopes in JavaScript.

  1. Global scope : variable which is announced in global scope can be used anywhere in the program very smoothly. فمثلا:

    var carName = " BMW";
    
    // code here can use carName
    
    function myFunction() {
         // code here can use carName 
    }
    
  2. Functional scope or Local scope : variable declared in this scope can be used in its own function only. فمثلا:

    // code here can not use carName
    function myFunction() {
       var carName = "BMW";
       // code here can use carName
    }
    

إليك مثال على ذلك:

<script>

var globalVariable = 7; //==window.globalVariable

function aGlobal( param ) { //==window.aGlobal(); 
                            //param is only accessible in this function
  var scopedToFunction = {
    //can't be accessed outside of this function

    nested : 3 //accessible by: scopedToFunction.nested
  };

  anotherGlobal = {
    //global because there's no `var`
  }; 

}

</script>

ستحتاج إلى التحقيق في حالات الإغلاق وكيفية استخدامها لجعل الأعضاء الخاصين .


أفكر في أفضل ما يمكنني القيام به هو إعطائك مجموعة من الأمثلة للدراسة. يتم ترتيب المبرمجين جافا سكريبت عمليا من خلال مدى فهمهم للمجال. يمكن أن يكون في بعض الأحيان غير بديهي تماما.

  1. متغير عالمي النطاق

    // global scope
    var a = 1;
    
    function one() {
      alert(a); // alerts '1'
    }
    
  2. النطاق المحلي

    // global scope
    var a = 1;
    
    function two(a) {
      // local scope
      alert(a); // alerts the given argument, not the global value of '1'
    }
    
    // local scope again
    function three() {
      var a = 3;
      alert(a); // alerts '3'
    }
    
  3. متوسط : لا يوجد شيء مثل نطاق الكتلة في جافا سكريبت (ES5 ؛ يقدم ES6 let )

    ا.

    var a = 1;
    
    function four() {
      if (true) {
        var a = 4;
      }
    
      alert(a); // alerts '4', not the global value of '1'
    }
    

    ب.

    var a = 1;
    
    function one() {
      if (true) {
        let a = 4;
      }
    
      alert(a); // alerts '1' because the 'let' keyword uses block scoping
    }
    
  4. متوسط : خصائص الكائن

    var a = 1;
    
    function Five() {
      this.a = 5;
    }
    
    alert(new Five().a); // alerts '5'
    
  5. متقدم : الإغلاق

    var a = 1;
    
    var six = (function() {
      var a = 6;
    
      return function() {
        // JavaScript "closure" means I have access to 'a' in here,
        // because it is defined in the function in which I was defined.
        alert(a); // alerts '6'
      };
    })();
    
  6. متقدم : دقة نطاق يستند إلى النموذج

    var a = 1;
    
    function seven() {
      this.a = 7;
    }
    
    // [object].prototype.property loses to
    // [object].property in the lookup chain. For example...
    
    // Won't get reached, because 'a' is set in the constructor above.
    seven.prototype.a = -1;
    
    // Will get reached, even though 'b' is NOT set in the constructor.
    seven.prototype.b = 8;
    
    alert(new seven().a); // alerts '7'
    alert(new seven().b); // alerts '8'
    
  7. عالمي + محلي : حالة معقدة إضافية

    var x = 5;
    
    (function () {
        console.log(x);
        var x = 10;
        console.log(x); 
    })();
    

    undefined و 10 بدلاً من 5 و 10 لأن جافا سكريبت دائمًا ما تقوم بتحريك التعريفات المتغيرة (وليس التهيئات) إلى أعلى النطاق ، مما يجعل الشفرة مكافئة لما يلي:

    var x = 5;
    
    (function () {
        var x;
        console.log(x);
        x = 10;
        console.log(x); 
    })();
    
  8. متغيرات clatch-scoped

    var e = 5;
    console.log(e);
    try {
        throw 6;
    } catch (e) {
        console.log(e);
    }
    console.log(e);
    

    هذا سوف يطبع 5 ، 6 ، 5 . داخل بند المصيد e يظلل المتغيرات العالمية والمحلية. لكن هذا النطاق الخاص هو فقط للمتغير الذي تم اصطياده. إذا كتبت var f; داخل عبارة catch ، فهذا هو نفس الشيء تمامًا كما لو كنت قد عرّفته قبل أو بعد كتلة try-catch.



جافا سكريبت المدرسة القديمة

بشكل تقليدي ، جافا سكريبت لديه حقًا نوعان فقط من النطاق:

  1. النطاق العالمي : المتغيرات معروفة في جميع أنحاء التطبيق ، من بداية التطبيق (*)
  2. النطاق الوظيفي : تُعرف المتغيرات داخل الدالة التي يتم الإعلان عنها ، من بداية الدالة (*)

لن أتحدث عن هذا ، لأن هناك العديد من الإجابات الأخرى التي تشرح الفرق.

جافا سكريبت الحديثة

تسمح أحدث مواصفات جافا سكريبت الآن أيضًا بنطاق ثالث:

  1. نطاق الكتلة : تُعرف المتغيرات داخل الكتلة التي تم الإعلان عنها ، من لحظة إعلانها فصاعدًا (**)

كيف أقوم بإنشاء متغيرات نطاق الكتلة؟

تقليديا ، يمكنك إنشاء المتغيرات الخاصة بك مثل هذا:

var myVariable = "Some text";

يتم إنشاء متغيرات نطاق الكتلة على النحو التالي:

let myVariable = "Some text";

إذن ما هو الفرق بين النطاق الوظيفي ونطاق الكتلة؟

لفهم الفرق بين النطاق الوظيفي ونطاق الحظر ، ضع في اعتبارك الشفرة التالية:

// i IS NOT known here
// j IS NOT known here
// k IS known here, but undefined
// l IS NOT known here

function loop(arr) {
    // i IS known here, but undefined
    // j IS NOT known here
    // k IS known here, but has a value only the second time loop is called
    // l IS NOT known here

    for( var i = 0; i < arr.length; i++ ) {
        // i IS known here, and has a value
        // j IS NOT known here
        // k IS known here, but has a value only the second time loop is called
        // l IS NOT known here
    };

    // i IS known here, and has a value
    // j IS NOT known here
    // k IS known here, but has a value only the second time loop is called
    // l IS NOT known here

    for( let j = 0; j < arr.length; j++ ) {
        // i IS known here, and has a value
        // j IS known here, and has a value
        // k IS known here, but has a value only the second time loop is called
        // l IS NOT known here
    };

    // i IS known here, and has a value
    // j IS NOT known here
    // k IS known here, but has a value only the second time loop is called
    // l IS NOT known here
}

loop([1,2,3,4]);

for( var k = 0; k < arr.length; k++ ) {
    // i IS NOT known here
    // j IS NOT known here
    // k IS known here, and has a value
    // l IS NOT known here
};

for( let l = 0; l < arr.length; l++ ) {
    // i IS NOT known here
    // j IS NOT known here
    // k IS known here, and has a value
    // l IS known here, and has a value
};

loop([1,2,3,4]);

// i IS NOT known here
// j IS NOT known here
// k IS known here, and has a value
// l IS NOT known here

هنا ، يمكننا أن نرى أن المتغير j بنا معروف فقط في الحلقة الأولى ، ولكن ليس قبل وبعد. ومع ذلك ، فإن المتغير i بنا معروف في الوظيفة بأكملها.

أيضًا ، ضع في اعتبارك أن المتغيرات التي تم تحديد نطاقها غير معروفة قبل أن يتم الإعلان عنها لأنها غير مرفوعة. لا يُسمح لك أيضًا بإعادة تعيين متغير الكتلة المحدد نفسه داخل المجموعة نفسها. وهذا يجعل المتغيرات ذات النطاق أقل عرضة للخطأ من المتغيرات ذات النطاق العالمي أو الوظيفي ، والتي يتم رفعها والتي لا تنتج أي أخطاء في حالة إعلانات متعددة.

هل من الآمن استخدام متغيرات نطاق الكتلة اليوم؟

سواء كان الاستخدام الآمن اليوم أم لا ، يعتمد على البيئة الخاصة بك:

  • إذا كنت تكتب شفرة JavaScript من جانب الخادم ( Node.js ) ، فيمكنك استخدام العبارة let بأمان.

  • إذا كنت تكتب شفرة جافا سكريبت من جانب العميل وتستخدم أداة نقل (مثل Traceur ) ، فيمكنك استخدام العبارة let بأمان ، ولكن من المرجح أن يكون كودك أي شيء غير مثالي فيما يتعلق بالأداء.

  • إذا كنت تكتب شفرة جافا سكريبت من جانب العميل ولا تستخدم برنامج التحويل البرمجي ، فيجب التفكير في دعم المتصفح.

    اليوم ، 23 من شباط 2016 ، هذه بعض المتصفحات التي لا تدعم let أو لا تحصل على دعم جزئي فقط:

    • Internet explorer 10 and below (no support)
    • Firefox 43 وما دونه (بدون دعم)
    • سفاري 9 وتحته (لا يوجد دعم)
    • Opera Mini 8 والإصدارات الأقل (بدون دعم)
    • متصفح Android 4 وما دونه (بدون دعم)
    • Opera 36 والإصدارات الأقل (دعم جزئي)
    • Chome 51 وأدناه (دعم جزئي)

كيفية تتبع دعم المتصفح

للحصول على نظرة عامة محدّثة حول أي المتصفحات تدعم العبارة let في وقت قراءتك لهذه الإجابة ، انظر صفحة " Can I Use .

(*) يمكن تهيئة متغيرات النطاق العالمي والعملي واستخدامها قبل إعلانها لأن متغيرات جافا سكريبت يتم hoisted . هذا يعني أن الإعلانات تكون دائما في قمة النطاق.

(**) لا يتم رفع متغيرات كتلة النطاق


المتغيرات المعلنة عالميا لها نطاق عالمي. يتم تحديد نطاق المتغيرات المعلنة داخل إحدى الوظائف إلى تلك الوظيفة ، والمتغيرات العمومية الظل التي تحمل الاسم نفسه.

(أنا متأكد من أن هناك العديد من الخواطر التي سيكون مبرمجو جافا سكريبت الحقيقيون قادرين على الإشارة إليها في إجابات أخرى. وعلى وجه الخصوص ، صادفت هذه الصفحة حول ما يعنيه this بالضبط في أي وقت. نأمل أن يكون هذا الرابط التمهيدي كافيًا لتبدأ على أية حال.)






javascript variables scope