سؤال

في JavaScript، من الممكن الإعلان عن متغيرات متعددة مثل هذا:

var variable1 = "Hello World!";
var variable2 = "Testing...";
var variable3 = 42;

...او مثل هذا:

var variable1 = "Hello World!",
    variable2 = "Testing...",
    variable3 = 42;

هل إحدى الطرق أفضل/أسرع من الأخرى؟

هل كانت مفيدة؟

المحلول

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

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

نصائح أخرى

وبالاضافة الى الصيانة، والطريقة الأولى يلغي إمكانية وقوع الحوادث إنشاء المتغيرات العالمية:

(function () {
var variable1 = "Hello World!" // semicolon is missed out accidently
var variable2 = "Testing..."; // still a local variable
var variable3 = 42;
}());

وعلى الرغم من أن الطريقة الثانية هي أقل تسامحا:

(function () {
var variable1 = "Hello World!" // comma is missed out accidently
    variable2 = "Testing...", // becomes a global variable
    variable3 = 42; // a global variable as well
}());

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

وانها أكثر قابلية للقراءة كثيرا عندما تفعل ذلك بهذه الطريقة:

var hey = 23;
var hi = 3;
var howdy 4;

ولكن يأخذ مساحة وخطوط من التعليمات البرمجية بهذه الطريقة أقل:

var hey=23,hi=3,howdy=4;

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

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

وربما مثل هذا

var variable1 = "hello world"
, variable2 = 2
, variable3 = "how are you doing"
, variable4 = 42;

وفيما عدا عند تغيير المتغير الأول أو الأخير فمن السهل للحفاظ على والقراءة.

introducted

الإتلاف المهمة التي يعمل لطيف جدا:

و[a, b] = [1, 2] سوف a يساوي 1 وسوف b يساوي 2.

var variable1 = "Hello World!";
var variable2 = "Testing...";
var variable3 = 42;

وهو أكثر قابلية للقراءة من:

var variable1 = "Hello World!",
    variable2 = "Testing...",
    variable3 = 42;

ولكن يفعلون الشيء نفسه.

يستخدم ES6 مهمة التدمير :سيقوم بتفكيك القيم من المصفوفات، أو خصائص الكائنات، إلى متغيرات مميزة.

let [variable1 , variable2, variable3] = 
["Hello World!", "Testing...", 42];

console.log(variable1); // Hello World!
console.log(variable2); // Testing...
console.log(variable3); // 42

وبلدي إلا، استخدام بعد أساسي للفاصلة في لحلقة:

for (var i = 0, n = a.length; i < n; i++) {
  var e = a[i];
  console.log(e);
}

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

وحتى رؤية من العمل، بقي سؤال عما إذا كان ن المحلي إلى وظيفة.

وهذا يتحقق، n غير المحلي:

a=[3,5,7,11];
(function l () { for (var i = 0, n = a.length; i < n; i++) {
  var e = a[i];
  console.log(e);
}}) ();
console.log(typeof n == "undefined" ?
  "as expected, n was local" : "oops, n was global");

لحظة لم أكن متأكدا، التبديل بين اللغات.

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

وأشعر أن مفاضلة يستحق ذلك، لو كان ذلك يعني الفطام مطور الخروج من اسقاط 'فار "في أي مكان كانوا يشعرون.

والناس قد يشكو JSLint، أفعل أيضا، ولكن وتوجه الكثير من ذلك ليس تجاه القضايا تثبيت مع اللغة، ولكن في تصحيح العادات السيئة من المبرمجون ومنع المشاكل في قانون يكتبون بالتالي. لذلك:

و"في لغات مع نطاق كتلة، ينصح عادة أن يتم تعريف المتغيرات في موقع الاستخدام لأول مرة، ولكن نظرا لأن جافا سكريبت لايوجد نطاق كتلة، فمن الحكمة أن يعلن كل من المتغيرات وظيفة في أعلى وظيفة من المستحسن أن يكون البيان فار واحد أن تستخدم في وظيفة ". - http://www.jslint.com/lint.html#scope

وأعتقد انها مسألة تفضيل شخصي. أنا أفضل أن تفعل ذلك بالطريقة التالية:

   var /* Vars */
            me = this, that = scope,
            temp, tempUri, tempUrl,
            videoId = getQueryString()["id"],
            host = location.protocol + '//' + location.host,
            baseUrl = "localhost",
            str = "Visit W3Schools",
            n = str.search(/w3schools/i),
            x = 5,
            y = 6,
            z = x + y
   /* End Vars */;

وهناك سبب آخر لتجنب إصدار بيان واحد (واحد <م> فار ) والتصحيح. إذا تم طرح استثناء في أي خطوط مهمة تتبع المكدس لا يظهر الا في سطر واحد.

إذا كان لديك 10 المتغيرات المحددة مع بناء الجملة فاصلة لديك أي وسيلة للتعرف مباشرة أي واحد كان الجاني.

ولا تعاني النسخة بيان الفرد من هذا الغموض.

يمكن تطبيق مفهوم "التماسك عبر الاقتران" بشكل عام أكثر من مجرد الكائنات/الوحدات/الوظائف.يمكن أن يخدم أيضًا في هذه الحالة:

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

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

http://en.wikipedia.org/wiki/Coupling_(computer_programming)

لذا اختر الأول.

أعتقد أنه قبل أن نبدأ في استخدام ES6، لم يكن الأسلوب مع إعلان var الفردي جيدًا ولا سيئًا (في حالة إذا كان لديك linters و 'use strict'.لقد كان حقا تفضيل الذوق.لكن الآن تغيرت الأمور بالنسبة لي.هناك أفكاري لصالح الإعلان متعدد الأسطر:

  1. الآن لدينا نوعان جديدان من المتغيرات، و var أصبح عفا عليه الزمن.إنها ممارسة جيدة للاستخدام const في كل مكان حتى تحتاج حقا let.في كثير من الأحيان، ستحتوي التعليمات البرمجية الخاصة بك على إعلانات متغيرة مع تعيينها في منتصف التعليمات البرمجية، وبسبب نطاق الكتلة، ستقوم في كثير من الأحيان بنقل المتغيرات بين الكتل في حالة حدوث تغييرات صغيرة.أعتقد أنه من الأفضل القيام بذلك باستخدام الإعلانات متعددة الأسطر.

  2. أصبح بناء جملة ES6 أكثر تنوعًا، وحصلنا على أدوات تدمير وسلاسل قالبية ووظائف أسهم ومهام اختيارية.عندما تستخدم كل هذه الميزات بكثافة مع إعلانات var الفردية، فإن ذلك يضر بسهولة القراءة.

وهناك آخر العمر، وأنا أعلم، ولكن لإضافة التفاصيل الصغيرة من منظور لزميل الغوغليين:

والقضية الصيانة يمكن التغلب عليها بسهولة جدا مع التنسيق قليلا، مثل هذا.

let
  my_var1 = 'foo',
  my_var2 = 'bar',
  my_var3 = 'baz'
;

وأنا استخدم هذا التنسيق بدقة ومسألة تفضيل شخصي. I تخطي هذا الشكل للإعلانات واحدة، وبطبيعة الحال، أو حيث ببساطة اللثة يصل الأشغال.

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

    var categories = ko.observableArray(),
        keywordFilter = ko.observableArray(),
        omniFilter = ko.observable('').extend({ throttle: 300 }),
        filteredCategories = ko.computed(function () {
            var underlyingArray = categories();
            return ko.utils.arrayFilter(underlyingArray, function (n) {
                return n.FilteredSportCount() > 0;
            });
        }),
        favoriteSports = ko.computed(function () {
            var sports = ko.observableArray();
            ko.utils.arrayForEach(categories(), function (c) {
                ko.utils.arrayForEach(c.Sports(), function (a) {
                    if (a.IsFavorite()) {
                        sports.push(a);
                    }
                });
            });
            return sports;
        }),
        toggleFavorite = function (sport, userId) {
            var isFavorite = sport.IsFavorite();

            var url = setfavouritesurl;

            var data = {
                userId: userId,
                sportId: sport.Id(),
                isFavourite: !isFavorite
            };

            var callback = function () {
                sport.IsFavorite(!isFavorite);
            };

            jQuery.support.cors = true;
            jQuery.ajax({
                url: url,
                type: "GET",
                data: data,
                success: callback
            });
        },
        hasfavoriteSports = ko.computed(function () {
            var result = false;
            ko.utils.arrayForEach(categories(), function (c) {
                ko.utils.arrayForEach(c.Sports(), function (a) {
                    if (a.IsFavorite()) {
                        result = true;
                    }
                });
            });
            return result;
        });
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top