Создайте функцию JavaScript, чтобы принимать значения по умолчанию - PullRequest
2 голосов
/ 11 марта 2011
function myFunct(){

//blah blah blah

}

как построить функцию с параметрами пары ключ / значение, чтобы при ее вызове она называлась так?

myFunt(prm1:'value1',prm2:'value2',prm3:'value3');

, поэтому, когда мне нужно вызвать только 3-й параметр, я сделаю это:

myFunct(prm3:'value3');

Ответы [ 6 ]

3 голосов
/ 11 марта 2011

Укажите некоторые значения по умолчанию в вашей функции и затем вызовите, используя только те параметры, которые вам нужны:

function myFunct(param) {
    var prm1 = param.prm1 || "default1";
    var prm2 = param.prm2 || "default2";
    var prm3 = param.prm3 || "default3";
}

Назовите его, используя объект param, например:

myFunct({prm3:'value3'});

prm1 и prm2 получат значения по умолчанию, но prm3 получит то, что вы передали.

Вы можете указать любую комбинацию значений в вашем объекте param. Все, что вы пропустите, будут заполнены значениями по умолчанию.

Если вы используете jQuery, вы можете сделать это немного красивее, используя $.extend:

function myFunct(param) {
  var parameters = $.extend(true, /* deep copy */
      {prm1: "default1", prm2: "default2", prm3: "default3"}, param);
};

Первый объект, данный extend, будет использоваться по умолчанию, а свойства вашего param объекта будут объединены, когда они будут присутствовать.

2 голосов
/ 11 марта 2011
function myFunt(jsonObj){
  var param3 = jsonObj.prm3;
}

Вызовите функцию следующим образом:

myFunt({prm3: 'value3'});
1 голос
/ 11 марта 2011

Javascript напрямую не поддерживает этот синтаксис (в частности, именованные параметры), поэтому вам придется прибегнуть к некоторому обходному решению.Есть два подхода, которые работают в определенных ситуациях:

  1. Если вам нужны только определенные смежные подмножества предоставленных параметров, вы можете просто объявить их по порядку, а затем вручную проверить, имеют ли остальные параметрыбыл поставлен.Javascript позволяет вам вызывать функцию с меньшим количеством объявленных параметров, а непропущенные - по умолчанию undefined.Следовательно, вы можете сделать что-то вроде этого:

    function myFunc(prm3 ,prm1, prm1) {
        // Use defaults if not supplied
        if (typeOf(prm1) == 'undefined') prm1 = 'value1';
        if (typeOf(prm2) == 'undefined') prm2 = 'value2';
    
        // Rest of function as normal
        ...
    };
    
  2. В качестве альтернативы, если вам нужна большая гибкость (т. Е. Либо prm3, либо prm2 могут быть предоставлены самостоятельно, вынужен какой-то способ связать имя со значением. Следовательно, вам нужно будет передать все параметры в виде связанного массива, а javascript - это просто объект:

    function myFunc(prms) {
        // Unpack actual arguments - if not supplied, will be 'undefined'
        var prm1 = prms.prm1;
        var prm2 = prms.prm2;
        var prm3 = prms.prm3;
    
        // Rest of function as normal
        ...
    };
    
    // Call this function something like the following:
    myFunc({prm1: 'Hello', prm3: 'World'});
    

Теперьоба эти подхода имеют недостатки, но если вам нужен для поддержки необязательных аргументов, это единственный способ, которым я знаю, чтобы сделать это.

1 голос
/ 11 марта 2011

Насколько я знаю, это не поддерживается Javascript. Однако вы можете добиться аналогичного эффекта, просто передав один аргумент, который является объектом.

Звоните:

foo({ prm1: 'value1', prm2: 'value2', prm3: 'value3'})

Определение функции:

function foo(args)
{
    //use values accordingly
    var prm1 = args.prm1;
}
0 голосов
/ 11 марта 2011

Это проще всего сделать, передав объект в качестве аргумента:

myFunct({prm1: 'value', prm2: 'value', prm3: 'value'});

Однако, если вы хотите, чтобы любой пропущенный ключ имел значение по умолчанию, наиболее распространенная методология для этого - использовать $.extend (при условии, что вы используете jQuery). Пример:

function myFunct(obj) {
    var defaults = {
        prm1: 'value',
        prm2: 'value',
        prm3: 'value'
    };
    // Set any defaults
    obj = $.extend(defaults, obj);
    // Output the results to the console
    for (var i in obj) {
        if (obj.hasOwnProperty(i)) {
            console.log("obj[" + i + "] =", obj[i]);
        }
    }
}

Тогда вы можете вызвать пример кода:

myFunct(); // will output all three params as being "value"
myFunct({prm3: 'test'}); // will output first two as being "value", third as being "test"

Если вы не используете jQuery, вы можете использовать метод, описанный lwburk выше . Тем не менее, метод lwburk становится довольно длинным, если у вас есть lot возможных вариантов.

Причина, по которой работает метод расширения, заключается в том, что он берет первый объект (в данном случае default) и перезаписывает все значения в первом объекте (default) значениями, указанными во втором объекте (obj в этот случай). Так $.extend({a: 1, b: 2}, {a: 2}) возвращает {a: 2, b: 2}; обратите внимание, что значение a было взято из второго объекта, но значение b из первого не было затронуто, поскольку оно не было указано во втором.

В других библиотеках есть похожие extend методы (не обширный список):

Или вы можете написать свой собственный или использовать код из любого из вышеперечисленных.

0 голосов
/ 11 марта 2011

Используйте массивы.

:

var param = [null, 'value2', null]

или

var param = ['value1', 'value2', 'value3']

с функцией:

myFunct(param);

function myFunct(array){

//blah blah blah

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...