When you call obj.method()
in Javascript the method is passed obj
as this
. Calling document.getElementById('x')
with therefore set this
to document
.
However if you just write f = document.getElementById
you now have a new reference to the function, but that reference is no longer "bound" to document
.
So your code doesn't work because when you call f
as a bare function name it ends up bound to the global object (window
). As soon as the innards of the function try to use this
it finds that it now has a window
instead of a document
and unsurprisingly it doesn't like it.
You can make f
work if you call it so:
var x = f.call(document, 'x');
which calls f
but explicitly sets the context to document
.
The others way to fix this is to use Function.bind()
which is available in ES5 and above:
var f = document.getElementById.bind(document);
and is really just a generalised short cut for creating your own wrapper that correctly sets the context:
function f(id) {
return document.getElementById(id);
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…