Quando si chiama obj.method()
in Javascript il metodo viene passato obj
come this
. Chiamando document.getElementById('x')
con quindi impostato this
a document
.
Tuttavia, se basta scrivere f = document.getElementById
adesso avete un nuovo di riferimento alla funzione, ma che il riferimento non è più "legato" a document
.
Quindi il tuo codice non funziona perché quando chiami f
come un nome di funzione nuda finisce legato all'oggetto globale (window
). Non appena l'interno della funzione tenta di utilizzare this
, rileva che ora ha uno window
anziché uno document
e non sorprende che non gli piaccia.
È possibile far f
lavoro se lo si chiama così:
var x = f.call(document, 'x');
che chiama f
ma esplicitamente imposta il contesto per document
.
Il modo ad altri di risolvere questo problema è quello di utilizzare Function.bind()
che è disponibile solo in ES5:
var f = document.getElementById.bind(document);
ed è in realtà solo una scorciatoia generalizzato per creare il proprio wrapper che imposta correttamente il contesto:
function f(id) {
return document.getElementById(id);
}
Per chiarire questa risposta, 'this' in' documento .getElementById() 'è' document', mentre 'this' dove stai eseguendo il tuo scope è l'ambito globale, noto anche come' this' è l'oggetto 'window'. –