Nee, jij stelde voor om het object als parameter aan de stateChanged functie mee te geven. In mijn voorstel wordt het object gewoon gebind als 'this'. Zoals je nu ook in je edit gezet hebt

Elk function object, wat stateChanged ook is, heeft een method genaamd call(), waarmee je de functie aan kunt roepen. De eerste parameter van de call() method staat voor de 'this' pointer waarmee de functie moet worden aangeroepen, de overige parameters van call() worden direct doorgegeven als functieparameters in de funciteaanroep.
Overigens heb je ook nog apply() die precies zo werkt, maar dan moet je alle functieparameters als een array opgeven (wat handig is als je die toevallig in een array hebt staan)
JavaScript:
1
2
3
4
5
6
7
8
9
| function foo(x, y)
{
alert(this);
alert(x);
alert(y);
}
foo.call(myObj, 1, 2);
foo.apply(myObj, [1, 2]); |
Overigens gebruiken veel mensen hier een bind() utility function voor die dat automatisch voor je regelt, iets in de trant van:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| Function.prototype.bind = function(obj)
{
var func = this;
var args = [].splice.call(arguments, 1);
return function() { func.apply(obj, args.concat([].splice.call(arguments, 0))); }
}
// en dan, met foo() uit het vorige voorbeeld:
var f = foo.bind(myObj);
f(1, 2);
// of
f = foo.bind(myObj, 1);
f(2);
// of
f = foo.bind(myObj, 1, 2);
f(); |
Zodat je in jouw code gewoon kan doen:
JavaScript:
1
2
3
4
5
6
| ajax = function(url, callback)
{
this.xmlHttp = GetXmlHttpObject();
this.xmlHttp.onreadystatechange = stateChanged.bind(this.xmlHttp);
..
} |
die [].splice.call() syntax is helaas nodig omdat 'arguments' geen echte Javascript array is - hij gedraagt zich alleen maar zo. Je kunt 'm dus niet zomaar meegeven aan concat(), en je kunt er ook geen splice() of shift() op aanroepen.
[
Voor 28% gewijzigd door
.oisyn op 11-09-2009 12:09
]