Справяне с роботи библиотека с възел, забелязах това
var robots = new require("robots").RobotsParser();
се различава от
var robots = new (require("robots")).RobotsParser();
Първият require
не се оплаква, че a this.someFunction()
не съществува, докато втората е успешна. По някаква причина this
обектът в първия ред по-горе очевидно се отнася до глобалния обект, докато във втория ред той е свързан с robots
модул. Защо?
Грешката, която получавам е:
/home/user/crawler/lib/robots/lib/parser.js:44
this.setUrl(url, after_parse);
^
TypeError: Object #<Object> has no method "setUrl"
setUrl
е действителното someFunction
споменати в примера.
Отговори:
1 за отговор № 1var robots = new require("robots").RobotsParser();
се анализира като
var robots = (new require("robots")).RobotsParser();
той се опитва да извика RobotsParser
метод на require()
инстанция. Не каквото искаше!
1 за отговор № 2
Първият ред прави извикване на конструктор на require
, което ефективно променя. \ t this
препратка към обхвата на библиотеката, за да посочи нова, предполагаема инстанция на require
, Това е неправилно и require
винаги трябва да се нарича редовна функция. Добавянето на скоби (както във втория ред) изчиства проблема, тъй като вместо това ще се създаде нова инстанция на RobotsParser
.