Предупреждение: сначала ошибки в коде JavaScript!
// 1: buggy counter
// -----------------
// problem: 'this' can be "broken"
var Counter1 = function() {
this.count = 0;
this.increment = function() {
function increment_helper(){
++this.count; // this refers to window (global), not to the object that Counter1 was called with
}
increment_helper();
}
this.reset = function() { this.count = 0; }
this.get_count = function() { return this.count; }
}
var counter1 = new Counter1();
counter1.increment();
document.writeln("<p> 1: " + counter1.get_count() + "</p>");
Как видно, this
в increment_helper
скорее относится к глобальная область (или область window
, если быть точным, ЕСЛИ я все понял) вместо ссылки на this в закрывающем замыкании. Таким образом, вывод будет:
0
вместо
1
Я перечислю лучшее (все еще не идеальное, но приемлемое) решение, а затем задам главный вопрос. Итак, решение (ИМХО) можно найти так:
// 2: better counter
// -----------------
// solved: 'that' can't be "broken"
var Counter2 = function() {
var that = this;
that.count = 0;
that.increment = function() {
function increment_helper(){
++that.count; // that refers right to the object the Counter1 was called with
}
increment_helper();
}
that.reset = function() { that.count = 0; }
that.get_count = function() { return that.count; }
}
var counter2 = new Counter2();
counter2.increment();
document.writeln("<p> 2: " + counter2.get_count() + "</p>");
Итак, главный вопрос: почему этот
особенный, как никто другой в JavaScript? Почему это только этот
и для какой цели?
Большое спасибо!
Обновление: После комментария @Jordan ниже (где он объяснил разницу между относительными переменными например, , эти
и переменные с областью видимости как обычные), перефразируя мои вопросы:
A: каково общее обоснование относительных переменных?
B: почему это
единственная относительная переменная в JavaScript? Любое объяснение того, почему концепция относительной / ограниченной области может применяться (исключительно) к каждой переменной?