Почему «это» разрешение настолько особенное в JavaScript?

Предупреждение: сначала ошибки в коде 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? Любое объяснение того, почему концепция относительной / ограниченной области может применяться (исключительно) к каждой переменной?

5
задан BreakPhreak 14 June 2011 в 16:20
поделиться