Tratando con el robots biblioteca de nodos, noté que
var robots = new require("robots").RobotsParser();
difiere de
var robots = new (require("robots")).RobotsParser();
El primero require
falla lamentando que un this.someFunction()
no existe, mientras que el segundo tiene éxito. Por alguna razón, el this
el objeto en la primera línea de arriba aparentemente se refiere al objeto global, mientras que en la segunda línea está vinculado al robots
módulo. ¿Por qué?
El error que recibo es:
/home/user/crawler/lib/robots/lib/parser.js:44
this.setUrl(url, after_parse);
^
TypeError: Object #<Object> has no method "setUrl"
setUrl
es el actual someFunction
mencionado en el ejemplo.
Respuestas
1 para la respuesta № 1var robots = new require("robots").RobotsParser();
se analiza como
var robots = (new require("robots")).RobotsParser();
es decir, trata de llamar al RobotsParser
método de un require()
ejemplo. No ¡que querías!
1 para la respuesta № 2
La primera línea hace una invocación de constructor de require
, que modifica efectivamente el this
referencia en el alcance de la biblioteca para apuntar a una nueva instancia supuesta de require
. Esto es incorrecto y require
siempre debe llamarse como una función regular. Agregar el paréntesis (como en la segunda línea) borra el problema, ya que en su lugar creará una nueva instancia de RobotsParser
.