Написал функцию, для преобразования 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.
Почему так происходит? Стоит избегать попадания регулярных выражений в замыкание?