Ключевое слово JavaScript * this * указывает на окно внутри string.prototype - PullRequest
4 голосов
/ 01 апреля 2011

Хорошо, это, вероятно, принесет мне значок Headslam of the Day.

Почему this указывает на window в следующем коде?

if (!String.prototype.Trim)
{
    String.prototype.Trim = function()
    {
        var result = this.replace(/^\s+|\s+$/g, "");
        return result;
    };
}

Насколько я понимаю, this должно соответствовать значению текущего экземпляра строки.Вместо этого он оценивает текущий объект окна.Таким образом, следующее с треском проваливается:

var baz = 'foo bar      '.Trim();

Обратите внимание, что этот код использовался в течение достаточно долгого времени и основан на коде, который я вижу, рекламируемый повсюду на intartoobs.Таким образом, этот шаблон кажется рекомендуемым способом сделать это.Я не могу понять, почему this не указывает на данные, на которые, я думаю, они должны указывать.(В Visual Studio при наведении на него курсора или просмотре в окне «Наблюдения» он отображается как [object window]).

(IE 8 [32-bit]; Win7; обычная HTML-страница.)

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

В Visual Studio при наведении на него курсора или просмотре в окне «Наблюдения» он отображается как [окно объекта]

Похоже на ошибку разрешения области действия в VS.Нет никакого способа, которым это может быть ошибкой в ​​IE, иначе тысячи прототипных функций сломались бы.

0 голосов
/ 08 марта 2019

Недавно я столкнулся с этой проблемой и обнаружил, что причиной является пакет JS, который искажает мой код. Я смог исправить это, заключив код, модифицирующий String.prototype в анонимную функцию, и затем вызвав его.

Так что вместо:

String.prototype.myFunction = function () { ... }

Я должен был написать:

(function () {
    String.prototype.myFunction = function () {
        ...
    }
})();
...