Показать сообщение отдельно
  #1 (permalink)  
Старый 08.12.2008, 16:30
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Регулярное выражение в замыкании, проблема в IE
Написал функцию, для преобразования CSS-свойст:
border-bottom-color → borderBottomColor
background-image → backgroundImage
z-index → zIndex
и т.д.

Вот сама функция:
function change(prop) {
	var expr = /-([a-z])/g;
	return prop == 'float' ? 'styleFloat' : expr.test(prop) ? prop.replace(expr, function () {
		return arguments[1].toUpperCase();
	}) : prop;
}

Используем:
alert([change('background-image'), change('background-image')]);

Результат:
backgroundImage,backgroundImage

Все работает нормально

Начинаем извращаться над функцией, занесем инициализацию переменной в замыкание, чтобы каждый раз при вызове функции «change» не создавать новый объект «RegExp»:
var change = function () {
	var expr = /-([a-z])/g;
	return function(prop) {
		return prop == 'float' ? 'styleFloat' : expr.test(prop) ? prop.replace(expr, function () {
			return arguments[1].toUpperCase();
		}) : prop;
	};
}();

Вызываем с теме же параметрами и получаем результат:
backgroundImage,background-image

Второй раз преобразования не произошло.

Это еще не конец фокуса. Вызовем функцию 3 раза:
alert([change('background-image'), change('background-image'), change('background-image')]);

Получим:
backgroundImage,background-image,backgroundImage

Вызовем 4 раза:
alert([change('background-image'), change('background-image'), change('background-image'), change('background-image')]);

Получим:
backgroundImage,background-image,backgroundImage,background-image

и т.д.

Такое поведение наблюдается только в IE любой версии, даже 8b2.
Почему так происходит? Стоит избегать попадания регулярных выражений в замыкание?

Последний раз редактировалось Octane, 08.12.2008 в 17:44. Причина: Исправил регулярное выражение
Ответить с цитированием