ES2015 ve üstü
ES2015'te, adlandırılmış parametreleri simüle etmek için parametre yok etme kullanılabilir. Arayanın bir nesneyi geçirmesini gerektirir, ancak varsayılan parametreleri de kullanırsanız işlevin içindeki tüm denetimleri önleyebilirsiniz:
myFunction({ param1 : 70, param2 : 175});
function myFunction({param1, param2}={}){
// ...function body...
}
// Or with defaults,
function myFunc({
name = 'Default user',
age = 'N/A'
}={}) {
// ...function body...
}
ES5
İstediğinize yaklaşmanın bir yolu var, ancak Function.prototype.toString
[ES5] dereceye kadar uygulamaya bağlı olan , bu nedenle tarayıcılar arası uyumlu olmayabilir.
Fikir, bir nesnenin özelliklerini karşılık gelen parametreyle ilişkilendirebilmeniz için işlevin dize temsilinden parametre adlarını ayrıştırmaktır.
Bir işlev çağrısı daha sonra
func(a, b, {someArg: ..., someOtherArg: ...});
Burada a
ve b
konum bağımsız değişkenleridir ve son bağımsız değişken, adlandırılmış bağımsız değişkenlere sahip bir nesnedir.
Örneğin:
var parameterfy = (function() {
var pattern = /function[^(]*\(([^)]*)\)/;
return function(func) {
// fails horribly for parameterless functions ;)
var args = func.toString().match(pattern)[1].split(/,\s*/);
return function() {
var named_params = arguments[arguments.length - 1];
if (typeof named_params === 'object') {
var params = [].slice.call(arguments, 0, -1);
if (params.length < args.length) {
for (var i = params.length, l = args.length; i < l; i++) {
params.push(named_params[args[i]]);
}
return func.apply(this, params);
}
}
return func.apply(null, arguments);
};
};
}());
Hangi olarak kullanırsınız:
var foo = parameterfy(function(a, b, c) {
console.log('a is ' + a, ' | b is ' + b, ' | c is ' + c);
});
foo(1, 2, 3); // a is 1 | b is 2 | c is 3
foo(1, {b:2, c:3}); // a is 1 | b is 2 | c is 3
foo(1, {c:3}); // a is 1 | b is undefined | c is 3
foo({a: 1, c:3}); // a is 1 | b is undefined | c is 3
DEMO
Bu yaklaşımın bazı dezavantajları vardır (uyarıldınız!):
- Son bağımsız değişken bir nesne ise, "adlandırılmış bağımsız değişken nesneleri" olarak değerlendirilir
- Her zaman işlevde tanımladığınız kadar çok argüman alırsınız, ancak bazılarının değeri olabilir
undefined
(hiç değere sahip olmaktan farklıdır). Bu, arguments.length
kaç bağımsız değişkenin geçtiğini test etmek için kullanamayacağınız anlamına gelir .
Sarıcıyı oluşturan bir işleve sahip olmak yerine, bir işlevi ve bağımsız değişkenler gibi çeşitli değerleri kabul eden bir işleve sahip olabilirsiniz.
call(func, a, b, {posArg: ... });
hatta genişletebilirsiniz Function.prototype
:
foo.execute(a, b, {posArg: ...});