protofunc()

Das ist meine function-bind-Methode…

Tags: javascript, jquery

Es gibt viele davon, aber diese ist meine:

$.bind = function(object, method){
	var args = Array.prototype.slice.call(arguments, 2);
	return function() {
		var args2 = [this].concat(args, $.makeArray( arguments ));
		return method.apply(object, args2);
	};
};

Zwei mögliche Nutzungsszenarien könnten so aussehen:

// Standard-Nutzung
function MyC(name){
     this.helloName = name ||
         'Welt';
    $('a')
         .bind('click', $.bind(this, this.sayHello));
    $('input')
         .bind('click', $.bind(this, this.saySomeThing, 'Hallo', 'Tschüß'));
 }
 MyC.prototype = {
     sayHello: function(elm, evt){
         alert(elm.tagName+' sagt - bei '+evt.type+' - Hallo zu '+this.helloName);
     },
    saySomeThing: function(elm, extra1, extra2, evt){
         alert(elm.tagName+' sagt - bei '+evt.type+' - '+extra1+' und '+extra2+' zu '+this.helloName);
    }
};
var myObject = new MyC();

 //Curry-Style-Nutzung
function add(){
     var num = 0;
     for(var i = 0; i < arguments.length; i++){
         if(!isNaN(arguments[i])){
             num += arguments[i];
         }
     }
     return num;
}
var add3 = $.bind(null, add, 3);
alert(add3(2));

Nachtrag

Garret Smith hat seine performante bind-Methode veröffentlicht, welche sich an die Funktionweise des kommenden ECMA-Standards (eingebaut in Firefox 3.1) anlehnt.

Daneben hat Stuart Langridge seine Slides vom Vortrag Secrets of JavaScript closures online gestellt. Dass was Stuart in seinem Vortrag wohl gesagt haben mag, war der Grund warum ich diese Methode gepostet habe. Sie spiegelt sehr gut den Charakter von JavaScript wieder. Einerseits sieht man einen typischen Designfehler (arguments ist kein Array), andererseits sieht man gleich mehrere coole JavaScript-Features, die man in anderen Sprachen vergeblich sucht. Wenn man sich die Slides anschaut, sich vorstellt, was er wohl gesagt haben mag und sich danach diese kleine Funktion anschaut, wird man nur eines sagen können “POWER”.

Written August 16, 2008 by
protofunc