Эх, TheShock, а я считал Вас разбирающимся в JS…
Почитали бы хотя бы статью по ссылке
То есть, простыми словами, литеральный регэксп не создается каждый раз при вызове var r = /regexp/.
Вместо этого браузер возвращает уже существующий объект, со всеми свойствами, оставшимися от предыдущего запуска.
Это баг спецификации ES3, и в ES5 он уже исправлен (соответственно, и некоторые браузеры подтянулись).
*facepalm*
Вы на код посмотрели перед запуском? Автор утверждает, что код
> /([0-9])+/g.test(«abc»)
Не вызывает проблем. Внимание, вопрос: чем таким '5' во втором вызове отличается от '5' в первом, что второй вызов вернет отличный от первого результат?
А теперь запускаем код в FF 3.6 или любом достаточно старом браузере и любуемся на результаты.
javascript: function test(d){return /([0-9])+/g.test(d)}; alert( [test('5'), test('5')] )
Автор так бежал, так спешил поделиться своей находкой, что до самой сути и не дошел. А если бы умел пользоваться поиском, нашел бы замечательную статью на javascript.ru.
Почти, но не совсем.
typeof g вернет function и все с виду нормально, но это только с виду. Вся проблема в том, что будут проблемы с this внутри функции. По сути, this является скрытым аргументом функции и передается неявно при вызове. Грубо говоря, запись вида obj.method(arg1, arg2, ...) будет преобразована в obj_method.call(obj, arg1, arg2, ...), а просто fncName(arg1, arg2, ...) в fncName.call(window, arg1, arg2, ...)
Понятно конечно, зачем всяким getElementById, document.getElementsByTagName, etc нужен объект document и почему нельзя получить его извне, не требуя привязки к объекту.
Поведение это, кстати, никоим образом к DOM'у не относится, а идет из самого языка ECMAScript. Пример:
var obj = {
fnc: function(){return this.document},
document: 'Hello, world!'
};
var p = obj.fnc;
alert( [obj.fnc(), p()] )
При вызове функции p this внутри будет указывать на window и функция вернет window.document, а не obj.document, как в первом случае. Соответственно, все эти нативные функции просто проверяют, является ли this экземпляром нужного «класса» HTMLDocument. Если нет — выбрасывают исключение.
В ES5 можно будет сделать так (Впрочем, и сейчас можно, если реализовать функцию bind руками. см. реализацию в prototype.js):
var p = obj.bind(obj);
Аналогично для getElementById, getElementsByTagName, querySelector, etc.
А зачем Вам глобальная переменная? Если в них нет необходимости, то и использовать их не нужно. Единственная польза от них в том, что Вы описали — прием запросов от JSONP. Там без глобальной переменной-приемника ответов не обойтись. Другого применения глобальной переменной придумать не могу. Разве что, быть может, взаимодействие с флешем.
В этом случае в глобальную область видимости попадает ourSuperBookmarklet и __osb
Чтобы не таскать 2 глобальных переменных, можно было сделать Ваш ourSuperBookmarklet синглтоном — все равно больше одного экземпляра Вам не нужно.
И вообще, при использовании замыканий можно было обойтись без каких-либо глобальных переменных. Правда, для JSONP оставить хотя бы одну придется.
Его увеличиваем до 23, правые обнуляем — 3 8 15 16 23 0
Почитали бы хотя бы статью по ссылке
Это баг спецификации ES3, и в ES5 он уже исправлен (соответственно, и некоторые браузеры подтянулись).
Вы на код посмотрели перед запуском? Автор утверждает, что код
> /([0-9])+/g.test(«abc»)
Не вызывает проблем. Внимание, вопрос: чем таким '5' во втором вызове отличается от '5' в первом, что второй вызов вернет отличный от первого результат?
Автор так бежал, так спешил поделиться своей находкой, что до самой сути и не дошел. А если бы умел пользоваться поиском, нашел бы замечательную статью на javascript.ru.
typeof g вернет function и все с виду нормально, но это только с виду. Вся проблема в том, что будут проблемы с this внутри функции. По сути, this является скрытым аргументом функции и передается неявно при вызове. Грубо говоря, запись вида obj.method(arg1, arg2, ...) будет преобразована в obj_method.call(obj, arg1, arg2, ...), а просто fncName(arg1, arg2, ...) в fncName.call(window, arg1, arg2, ...)
Понятно конечно, зачем всяким getElementById, document.getElementsByTagName, etc нужен объект document и почему нельзя получить его извне, не требуя привязки к объекту.
Поведение это, кстати, никоим образом к DOM'у не относится, а идет из самого языка ECMAScript. Пример:
При вызове функции p this внутри будет указывать на window и функция вернет window.document, а не obj.document, как в первом случае. Соответственно, все эти нативные функции просто проверяют, является ли this экземпляром нужного «класса» HTMLDocument. Если нет — выбрасывают исключение.
В ES5 можно будет сделать так (Впрочем, и сейчас можно, если реализовать функцию bind руками. см. реализацию в prototype.js):
Аналогично для getElementById, getElementsByTagName, querySelector, etc.
Ссылочка по теме.
Ну и так, к слову: в HTML5 есть нативное свойство document.head, а доступ к body издавна осуществляется как document.body.
Чтобы не таскать 2 глобальных переменных, можно было сделать Ваш ourSuperBookmarklet синглтоном — все равно больше одного экземпляра Вам не нужно.
И вообще, при использовании замыканий можно было обойтись без каких-либо глобальных переменных. Правда, для JSONP оставить хотя бы одну придется.