Cuando llame a obj.method()
en Javascript, el método se pasa obj
como this
. Llamando al document.getElementById('x')
con el conjunto this
a document
.
Sin embargo, si usted acaba de escribir f = document.getElementById
Ahora tiene un nuevo referencia a la función, pero que la referencia ya no es "obligado" a document
.
Por lo tanto, su código no funciona porque cuando llama al f
como un nombre de función simple, termina vinculado al objeto global (window
). Tan pronto como las entrañas de la función intenten usar this
, descubren que ahora tiene un window
en lugar de un document
y, como era de esperar, no le gusta.
Usted puede hacer f
trabajo si usted lo llama así:
var x = f.call(document, 'x');
que llama a f
sino explícitamente establece el contexto de document
.
La manera en que otros para solucionar este problema es utilizar Function.bind()
que sólo está disponible en la ES5:
var f = document.getElementById.bind(document);
y es realmente sólo un atajo generalizado para la creación de su propio envoltorio que establece correctamente el contexto:
function f(id) {
return document.getElementById(id);
}
Para aclarar esta respuesta, 'this' en' documento .getElementById() 'es' document', mientras que 'this' donde está ejecutando su scope es el alcance global, también conocido como' this' es el objeto 'window'. –