İşlev sağına nasıl bağlanabilirim? Örnek:Javascript: bir işlevin sağa mı bağlanıyor?
var square = Math.pow.bindRight(2);
console.log(square(3)); //desired output: 9
İşlev sağına nasıl bağlanabilirim? Örnek:Javascript: bir işlevin sağa mı bağlanıyor?
var square = Math.pow.bindRight(2);
console.log(square(3)); //desired output: 9
Ayrıca, takma adlar için kullanışlı kısayollar olan kısmi işlevleri de içeren bir dizi kütüphane vardır. Kısmi fonksiyonlarını kullanma
var square = function (x) {
return Math.pow(x, 2);
};
olurdu:
soruyormuşsun olanı yapmak "klasik" yolu ile
var square = Math.pow.partial(undefined, 2);
console.log(square(3));
Maalesef Function.prototype.partial
herhangi sağlanmaz tarayıcı.
/**
* @dependencies
* Array.prototype.slice
* Function.prototype.call
*
* @return Function
* returns the curried function with the provided arguments pre-populated
*/
(function() {
"use strict";
if (!Function.prototype.partial) {
Function.prototype.partial = function() {
var fn,
argmts;
fn = this;
argmts = arguments;
return function() {
var arg,
i,
args;
args = Array.prototype.slice.call(argmts);
for (i = arg = 0; i < args.length && arg < arguments.length; i++) {
if (typeof args[i] === 'undefined') {
args[i] = arguments[arg++];
}
}
return fn.apply(this, args);
};
};
}
}());
nesi var: Düzgün soruyu cevaplamak için
var square = function(x) {return x*x;};
, aşağıdakiler gibi, bir dizi parametresi ile "bağlı" işlevini çağıran anonim işlev oluşturmanız gerekir:
var square = function(x) {return Math.pow(x,2);};
Bu şekilde, herhangi bir sayıda parametreyi bağlayabilir, parametreleri yeniden düzenleyebilir veya ikisinin birleşimini yapabilirsiniz. Bununla birlikte, performansa bir miktar etkisi olduğu unutulmamalıdır, zira bu şekilde her bağlandığınızda yığına fazladan bir işlev çağrısı ekliyorsunuz.
Başka bir şey istediği dışında bir şey mi kastediyorsunuz? – gdoron
Bu cevabın kötü bir örnek olduğunu varsaymak zorundayım çünkü bu cevap verilen örnekte sorunu çok net bir şekilde çözüyor. –
Verilen örnek, çözülmesi gereken bir durum değildi, bu sadece bir örnekti, böylece ihtiyacım olan şeyi anlayabiliyordunuz. Üzgünüm, ama niyetiniz iyi olsa da bu işe yaramaz. – MaiaVictor
Function.prototype.bindRight = function() {
var self = this, args = [].slice.call(arguments);
return function() {
return self.apply(this, [].slice.call(arguments).concat(args));
};
};
var square = Math.pow.bindRight(2);
square(3); //9
Aslında standart kütüphaneyi veya popüler bir kütüphaneyi kullanarak bir uygulama bekliyordum. Olmadığı gibi görünüyor, bu yüzden bu doğru cevap. Teşekkür ederim. – MaiaVictor
Bu, kısmi uygulama yapmak istediğiniz gibi görünüyor. Subscore.js: http://documentcloud.github.com/underscore/
: Şansına
, ben bu Function.prototype.partial.js
olduğunu esansiyel JavaScript nesne yönelimli işlevleri, yöntemleri, sınıflar vb olarak kabul ettiğimiz bir kütüphane üzerinde çalışıyoruz
This method is like _.partial except that partial arguments are appended to those provided to the new function. Arguments func (Function): The function to partially apply arguments to. [arg] (…*) : Arguments to be partially applied. Returns (Function): Returns the new partially applied function.
sen 012 ile yapabilirsiniz: Lodash en partialRight
burada istediğiniz ve ne yapacak belgelerdir, bir tutucu olarak _
geçirilerek, doldurulmuş olması daha sonra:
var square = _.partial(Math.pow, _, 2);
console.log(square(3)); // => 9
Bu özellik, Şubat 2014 (1.6.0 çizgi) ortaya çıktı.
Bu cevabı daha önce görmemiştim. Bu aslında en iyi çözümdür. Teşekkürler. – MaiaVictor
Ayrıca aşağıdaki @ brian-m-hunt yanıtındaki lodash 'partialRight()' çözümüne bakın – Offirmo