JavaScript имеет область видимости функции, если вы объявите переменную с ключевым словом var, она будет локальной для текущей функции.Когда вы обращаетесь к переменной, она просматривает цепочку областей видимости, которая состоит из текущей функции, ее родительской функции,….Попробуйте:
function one() {
var foo = 'foo';
function two() {
console.log(foo) // undefined. I'll explain this
var foo = 'bar';
console.log(foo) // bar
}
two()
console.log(foo) // foo
}
one()
Большую часть времени мы определяем переменные в начале функций, потому что переменная, определенная в теле функции, поднимается.По сути, это означает, что она доступна во всей функции, даже до ее определения, но в этом случае ее значение равно undefined
.
Например, если переменная не определена, мы обычно получаем ReferenceError
, нов приведенном ниже фрагменте кода оба console.log()
просто печатают undefined
.
function foo() {
console.log(bar);
if (0) {
var bar = 'bar';
}
console.log(bar);
}
Итак, обычная практика заключается в том, что когда вы пишете длинные функции, вы отображаете это на себя.
Вы не должны писать все свои методы в конструкторе, это иногда полезно, когда мы хотим конфиденциальности, но в этом случае вам лучше использовать прототипы.
Собирая все это вместе, я написал бы:
var SiteParser = function() {};
SiteParser.prototype.emitForNext = function(message) {
this.emit("next", message);
};
SiteParser.prototype.pullJSON = function(path, processJSON) {
var self = this,
options = {
host: 'www.site.com',
port: 80,
path: path
};
http.get(options, function(res) {
// ...
}).on('error', function (e) {
self.emitForNext("got error: " + e.message);
});
};