how to call javascript function in html




أفضل طريقة لتحديد ما إذا لم يتم إرسال وسيطة إلى وظيفة JavaScript (8)

لقد رأيت الآن طريقتين لتحديد ما إذا تم تمرير وسيطة إلى وظيفة JavaScript. أتساءل إذا كانت إحدى الطرق أفضل من الأخرى أو إذا كان أحدها سيئ الاستخدام؟

 function Test(argument1, argument2) {
      if (Test.arguments.length == 1) argument2 = 'blah';

      alert(argument2);
 }

 Test('test');

أو

 function Test(argument1, argument2) {
      argument2 = argument2 || 'blah';

      alert(argument2);
 }

 Test('test');

بقدر ما أستطيع أن أقول ، كلاهما ينتجان نفس الشيء ، لكني استعملت الشيء الأول فقط من قبل في الإنتاج.

خيار آخر كما ذكر Tom :

function Test(argument1, argument2) {
    if(argument2 === null) {
        argument2 = 'blah';
    }

    alert(argument2);
}

وفقًا لتعليق خوان ، سيكون من الأفضل تغيير اقتراح توم إلى:

function Test(argument1, argument2) {
    if(argument2 === undefined) {
        argument2 = 'blah';
    }

    alert(argument2);
}

أنا آسف ، ما زلت لا أستطيع التعليق ، لذا للإجابة على جواب توم ... في javascript (undefined! = null) == false في الواقع لن تعمل هذه الدالة مع "null" ، يجب عليك استخدام "غير معرفة"


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

function foo(options) {

    default_options = {
        timeout : 1000,
        callback : function(){},
        some_number : 50,
        some_text : "hello world"
    };

    options = $.extend({}, default_options, options);
}

إذا قمت باستدعاء الوظيفة ، فعليك القيام بما يلي:

foo({timeout : 500});

سيكون متغير الخيارات حينئذ:

{
    timeout : 500,
    callback : function(){},
    some_number : 50,
    some_text : "hello world"
};

في بعض الأحيان قد ترغب في التحقق من الكتابة ، خاصة إذا كنت تستخدم الوظيفة كأداة getter و setter. التعليمة البرمجية التالية هي ES6 (لن يتم تشغيلها في EcmaScript 5 أو الأقدم):

class PrivateTest {
    constructor(aNumber) {
        let _aNumber = aNumber;

        //Privileged setter/getter with access to private _number:
        this.aNumber = function(value) {
            if (value !== undefined && (typeof value === typeof _aNumber)) {
                _aNumber = value;
            }
            else {
                return _aNumber;
            }
        }
    }
}

لماذا لا تستخدم !! المشغل أو العامل؟ هذا المشغل ، الذي تم وضعه قبل المتغير ، يحوله إلى منطقي (إذا فهمته جيدًا) ، لذا !!undefined و !!null (وحتى !!NaN ، الذي يمكن أن يكون مثيرًا للاهتمام) سيعود false .

هنا هو مثال:

function foo(bar){
    console.log(!!bar);
}

foo("hey") //=> will log true

foo() //=> will log false


هناك اختلافات كبيرة. دعونا نضع بعض حالات الاختبار:

var unused; // value will be undefined
Test("test1", "some value");
Test("test2");
Test("test3", unused);
Test("test4", null);
Test("test5", 0);
Test("test6", "");

باستخدام الطريقة الأولى التي تصفها ، سيستخدم الاختبار الثاني فقط القيمة الافتراضية. الطريقة الثانية سوف تكون مفترضة باستثناء أول (كما ستقوم JS بتحويل undefined ، و null ، و 0 ، و "" إلى القيمة المنطقية false . وإذا كنت تستخدم أسلوب Tom ، فسيستخدم الاختبار الرابع فقط الافتراضي!

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


يمكن أن يكون ملائماً اقتراب اكتشاف الحجة عن طريق استحضار وظيفتك مع كائن من الخصائص الاختيارية:

function foo(options) {
    var config = { // defaults
        list: 'string value',
        of: [a, b, c],
        optional: {x: y},
        objects: function(param){
           // do stuff here
        }
    }; 
    if(options !== undefined){
        for (i in config) {
            if (config.hasOwnProperty(i)){
                if (options[i] !== undefined) { config[i] = options[i]; }
            }
        }
    }
}

url = url === undefined ? location.href : url;




arguments