Вопрос об «этом» зарезервированном слове в JavaScript - PullRequest
3 голосов
/ 05 января 2011

У меня вопрос по поводу this зарезервированного слова в JavaScript.

Проверьте коды ниже:

Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
    }        
};

String.method('deentityify', function () {

    var entity = {
        quot: '"',
        lt: '<',
        gt: '>'
    };

    return function () {

        /*if (this === String.prototype) {
            alert('true');
        } else {
            alert('false');
        }*/

        return this.replace(/&([^&;]+);/g,
            function (a, b) {
                var r = entity[b];
                return typeof r === 'string' ? r : a;
            }
        );
    };
}());

document.write('&lt;&quot;&gt;'.deentityify());

Вы можете редактировать коды выше по адресу: http://jsfiddle.net/G3Tkm/

Мой вопрос:

Что такое зарезервированное слово this в строке 27 return this.replace(/&([^&;]+);/g,?

Я думаю: this === String.prototype, но это не так.

Тип '&lt;&quot;&gt;' является строкой, а тип this является объектом.Так что this !== '&lt;&quot;&gt;'

Большое спасибо!

1 Ответ

5 голосов
/ 05 января 2011

Всякий раз, когда я нахожу ключевое слово this в коде JavaScript, я обычно просто смотрю вверх, пока не найду окружающую функцию, в которой он находится.

Затем я пытаюсь понять, как эта функция вызывается из снаружи . Это важно, потому что значение this изменяется в зависимости от того, как вызывается функция.

Из вашего кода кажется, что работа String.method() заключается в добавлении методов в цепочку прототипов объекта String . Это то, что вы не должны делать на самом деле, это своего рода плохое поведение JavaScript и может вызвать некоторые проблемы в дальнейшем.

Однако, ради объяснения, всякий раз, когда вы вызываете метод deentityify для строки, такой как "foo".deentityify() - предположим, что это вызывает то, что вы назначили в String.method('deentityify', function () { - this, в действительности становится другой функцией (если String.method работает так, как я думаю).

Таким образом, при использовании "foo".deentityify()() ваш this будет ссылаться на вызывающего абонента, то есть "foo".deentityify(). А вызывающий "foo".deentityify() на самом деле "foo" сам.

Так что в основном this, в вашем случае, относится к объекту String, из которого вы вызываете метод.

...