ماذا تسمون هذا النحو جافا سكريبت, حتى أتمكن من البحث عنه?

StackOverflow https://stackoverflow.com/questions/3208236

  •  13-09-2020
  •  | 
  •  

سؤال

1) في الكود التالي ، ما هو السبب وراء صنع gameOfLive متغير وليس فقط function gameOfLife()?

2) ما هو gol?يبدو وكأنه صفيف ، ولكن أنا غير مألوف مع بناء الجملة أو ما يسمى به.

أنا أدرس http://sixfoottallrabbit.co.uk/gameoflife/

if (!window.gameOfLife) var gameOfLife = function() {

    var gol = {
        body: null,
        canvas: null,
        context: null,
        grids: [],
        mouseDown: false,
        interval: null,
        control: null,
        moving: -1,
        clickToGive: -1,
        table: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(''),
        tableBack: null,

        init: function(width, height) {
            gol.body = document.getElementsByTagName('body')[0];
            gol.canvas = document.createElement('canvas');
            if (gol.canvas.getContext) {
                gol.context = gol.canvas.getContext('2d');
                document.getElementById('content').appendChild(gol.canvas);
                gol.canvas.width = width;
                gol.canvas.height = height;
                gol.canvas.style.marginLeft = "8px";

                gol.control = document.getElementById('gridcontrol');

                gol.canvas.onmousedown = gol.onMouseDown;
                gol.canvas.onmousemove = gol.onMouseMove;
                gol.canvas.onmouseup = gol.onMouseUp;

                gol.addGrid(48,32,100,44,8);

                gol.refreshAll();
                gol.refreshGridSelect(-1);
                gol.getOptions(-1);

                gol.genTableBack();
            } else {
                alert("Canvas not supported by your browser. Why don't you try Firefox or Chrome? For now, you can have a hug. *hug*");
            }
        },
    }
}
هل كانت مفيدة؟

المحلول

var gameOfLife = function() { }

هو وظيفة التعبير, ، في حين

function gameOfLife() { }

هو إعلان الوظيفة.

على حد تعبير جوري 'كانجاكس' زايتسيف حول تعبيرات الوظيفة مقابل.إعلانات الوظيفة:

هناك اختلاف بسيط في سلوك الإعلانات و التعبيرات.

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

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

في هذه الحالة ، كما يذكر جويل كويهورن في تعليق, gameOfLife يتم تعريفه بشكل مشروط ، لذلك يلزم استخدام تعبير دالة.

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

if (!Array.prototype.indexOf) { 
    Array.prototype.indexOf = function(item, from) {
        /* implement Array.indexOf functionality,
           but only if there's no native support */
    }
}

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

(للحصول على أمثلة ، اقرأ على الصفحة ، على الرغم من أن محتوياتها ليست مناسبة تماما للمبتدئين)

نصائح أخرى

  1. في جافا سكريبت ، وظائف هي كائنات من الدرجة الأولى.هل يمكن تخزينها في الكائنات (المتغيرات) وتمريرها كوسائط إلى وظائف.كل وظيفة هي في الواقع Function كائن.

  2. gol هو كائن ، يتم تهيئته باستخدام كائن حرفي تدوين.


1) في التعليمات البرمجية التالية ، ما هو المنطق وراء جعل gameOfLive متغير وليس مجرد "وظيفة gameOfLife()"?


المتغيرات المحددة على المستوى العالمي هي أعضاء من وجوه نافذة.وذلك من خلال جعلها متغير ، تجعل من الممكن استخدام بناء الجملة window.gameOfLife().وهذا هو أيضا السبب في أنها يمكن أن تستخدم if (!window.gameOfLife) تحقق في بداية مقتطف.

ولكن هذا لا يفسر لماذا اختاروا أن تفعل ذلك بهذه الطريقة, و إعلان وظيفة سوف تفعل الشيء نفسه. مارسيل Korpel الجواب أفضل يشرح "لماذا" من الخيارين.


2) ما هو غول?يبدو أن مجموعة, ولكن أنا غير مألوف مع بناء الجملة أو ما يسمى.


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

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

var game = new gameOfLife();

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


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

بالتأكيد: لشرح بناء الجملة:

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

giveacodicetagpre.

GOL هو كائن (Hash)، و "INTION" مثال آخر على بناء الجملة أعلاه، باستثناء وضعه مباشرة في مفتاح "INIT" في هش "GOL".لذلك يمكن استدعاء وظيفة بدورها:

giveacodicetagpre.

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

بالنظر إلى وظيفة كمتغير قد تكون مفيدة إذا كنت ترغب في الحصول على وظيفة لكائن كائن.(انظر: http://www.permadi.com/tutorial/jsfunc/index.html)

أعتقد أن GOL هو كائن جافا سكريبت موضح في أزواج الاسم / القيمة - مثل تنسيق JSON.(انظر: http://www.hunlock.com/blogs/maceing_json_(_javascript_object_notation_)A>)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top