2012-03-20 25 views

cevap

6

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); 
      }; 
     }; 
    } 
}()); 
+0

Bu cevabı daha önce görmemiştim. Bu aslında en iyi çözümdür. Teşekkürler. – MaiaVictor

+0

Ayrıca aşağıdaki @ brian-m-hunt yanıtındaki lodash 'partialRight()' çözümüne bakın – Offirmo

-1

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.

+1

Başka bir şey istediği dışında bir şey mi kastediyorsunuz? – gdoron

+0

Bu cevabın kötü bir örnek olduğunu varsaymak zorundayım çünkü bu cevap verilen örnekte sorunu çok net bir şekilde çözüyor. –

+4

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

11
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 
+0

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

3

: Ş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. 
0

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ı.

İlgili konular