/ / "този" обект в require (). function () - javascript, node.js, този, изисква

"този" обект изисква () функция () - javascript, node.js, това изисква

Справяне с роботи библиотека с възел, забелязах това

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 за отговор № 1
var robots = new require("robots").RobotsParser();

се анализира като

var robots = (new require("robots")).RobotsParser();

той се опитва да извика RobotsParser метод на require() инстанция. Не каквото искаше!


1 за отговор № 2

Първият ред прави извикване на конструктор на require, което ефективно променя. \ t this препратка към обхвата на библиотеката, за да посочи нова, предполагаема инстанция на require, Това е неправилно и require винаги трябва да се нарича редовна функция. Добавянето на скоби (както във втория ред) изчиства проблема, тъй като вместо това ще се създаде нова инстанция на RobotsParser.