javascript - Sätta variabeln "this" enkelt?


Jag har en ganska bra förståelse för Javascript, förutom att jag inte kan hitta ett bra sätt att sätta variabeln "this". Tänk på:

var myFunction = function(){
    alert(this.foo_variable);
}

var someObj = document.body; //using body as example object
someObj.foo_variable = "hi"; //set foo_variable so it alerts

var old_fn = someObj.fn;   //store old value
someObj.fn = myFunction;   //bind to someObj so "this" keyword works
someObj.fn();              
someObj.fn = old_fn;       //restore old value

Finns det ett sätt att göra detta utan de sista 4 raderna? Det är ganska irriterande... Jag har försökt binda en anonym funktion, vilket jag tyckte var vackert och smart, men utan resultat:

var myFunction = function(){
    alert(this.foo_variable);
}

var someObj = document.body;        //using body as example object
someObj.foo_variable = "hi";        //set foo_variable so it alerts
someObj.(function(){ fn(); })();    //fail.

Uppenbarligen är det ett alternativ att skicka variabeln till myFunction... men det är inte poängen med den här frågan.

Tack.

Svar #1

Det finns två metoder definierade för alla funktioner i JavaScript, call() och apply(). Funktionssyntaxen ser ut så här:

call( /* object */, /* arguments... */ );
apply(/* object */, /* arguments[] */);

Vad dessa funktioner gör är att anropa den funktion de kallades på, och tilldela värdet av object-parametern till this.

var myFunction = function(){
    alert(this.foo_variable);
}
myFunction.call( document.body );

Svar #2

Jag tror att du letar efter call:

myFunction.call(obj, arg1, arg2, ...);

Detta anropar myFunction med this satt till obj.

Det finns också den något annorlunda metoden apply, som tar funktionens parametrar som en array:

myFunction.apply(obj, [arg1, arg2, ...]);

Svar #3

Om du vill 'lagra' värdet this till en funktion så att du kan kalla på det sömlöst senare (t.ex. när du inte längre har tillgång till det värdet), kan du bind det (inte tillgängligt i alla webbläsare dock):

var bound = func.bind(someThisValue);

// ... later on, where someThisValue is not available anymore

bound(); // will call with someThisValue as 'this'

Relaterade artiklar