2011-10-19 9 views
9

que estoy tratando de pasar document.write como una referencia a una variable:JavaScript document.write ahorro en una variable y decir que es

Ejemplo:

var f = document.write 

//then 
f('test'); 

funciona con alerta. ¿Por qué no funciona con document.write?

+1

Puede que no funcione porque la función 'write' se espera que se ejecute en el contexto de un' documento' y no de la 'ventana'. – Prusse

+1

Podría '.bind()', pero necesitaría una corrección para navegadores antiguos, y no sé cómo afectaría el rendimiento. 'var f = document.write.bind (document);' – user113716

Respuesta

7

Además de lo que ya se dijo, Javascript 1.8.5 tiene una solución nativa para el problema: la bind function

f = document.write.bind(document) 
f("hello") 

El enlace anterior también contiene un código de emulación para los navegadores que no soportan JS 1.8.5 todavía.

4

Algunas funciones, como eval y document.write, no se pueden usar de forma indirecta (es decir, haciendo referencia a través de variables).

Si aún desea utilizar document.write usando f, utilice:

function f(s){ 
    document.write(s); 
} 
f('test'); 
+1

Parece que tiene razón. ¿Alguna idea de por qué? – Dennis

+1

@Dennis 'document.write' parece perder su contexto cuando la función se refiere indirectamente. Al utilizar el método ['call'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call), es posible hacer referencia indirectamente a' document.write'. Código: 'var f = document.write; f.call (document, 'test') ' –

+0

Si desea referenciarlo por variable, debe hacer referencia a una función IE:' var f = function (i) {document.write (i); } ' –

3

Por qué no funciona No puedo decir sin más investigación, sino para resolver su problema:

var f = function(i) { document.write(i); } 
10

Como a alert no le importa qué es this (alert es global) y document.write (necesita saber en qué documento está escribiendo).

Si desea un contenedor, escriba una función de acceso directo.

function f(str) { document.write(str); } 

... y luego ir y ritual destripar a sí mismo para llamar la variable f. Self-describing es una virtud de buen código.

+0

Exactamente, tendría que llamar 'f 'de esta manera:' f.apply (document, [str]) '... un poco derrotando el propósito, supongo? Al menos puedes crear una referencia abreviada al objeto 'document'. – Peter

2

Debido a que pierde el valor correcto de this dentro de la función write ...

Puede pasar una referencia a document ...

var f = document; 

f.write("hello"); 

O envuelve al igual que otras soluciones sugieren.

3

supongo que es porque no se va a aplicar f para el documento (pero a la ventana)

Esto funciona:

var f = document.write; 
f.call(document, "Hello world!!!"); 
2

Otro, extraña manera de hacer esto, es:

var f = window.document.write; 
f.call(window.document, "test") 

O:

var f = document.write; 
f.apply(document, ["test"]); 
1

mismo problema que ha escrito en esta pregunta: Javascript Class Inheritance

Como ya han dicho que estás perdiendo el contexto funciones. Las funciones son objetos como cualquier otra cosa en javascript.llamando al var f = document.write obtendrá una referencia a la función, pero la función no tiene la referencia del documento que necesita.

ejemplo:

// give the window a new funciton 
window.foo = function() { 
    console.log('FOO!); 
} 

// get a reference to this funciton 
var fn = window.foo; 

// call via reference works and outputs 'FOO!!' to the console 
fn(); 

// attach it to your object 
var myObject = {}; 
myObject.Foo = fn; 

// call it it still works 
myObject.Foo(); 

ahora si la función hace referencia a this, lo anteriormente expuesto no funciona PORQUE this dependes en el contexto de llamada. La manera de salvar el contexto en el momento es el uso de un cierre como este ...

// remember this is the window context 

var fn = function (s) { 
    document.write(s); 
} 

La razón por la que funciona el código anterior es javascript mira a la función y no ve un objeto local document por lo que camina hasta el alcance y ve el alcance externo (en este caso el objeto window) tiene un documento y las llamadas escriben sobre eso. Efectivamente, la llamada a document.write() es lo mismo que escribir window.document.write()

Cuestiones relacionadas