Я пытаюсь заставить компилятор Google Closure не переименовывать объекты при передаче в качестве настроек или данных функции. Посмотрев на аннотации, представленные в jQuery, я подумал, что это сработает:
/** @param {Object.} data */
window.hello = function(data) {
alert(data.hello);
};
hello({ hello: "World" });
Однако все заканчивается так:
window.a = function(b) {
alert(b.a)
};
hello({a:"World"});
Функция ajax
, найденная здесь , имеет эту аннотацию и похоже, работает. Итак, почему этого не произойдет? Если данные - это возвращаемое значение из внешнего источника или объекта настроек, я хотел бы иметь возможность указать компилятору не трогать их, используя трюк this ["escape"]
для чего-то навязчивого. вот так на мой взгляд.
function ajax(success) {
// do AJAX call
$.ajax({ success: success });
}
ajax(function(data) {
alert(data.Success);
});
Результат:
$.b({c:function(a){alert(a.a)}});
успех
был переименован в c
, а Успех
(с большой буквы) был переименован в a
.
Теперь я компилирую тот же код с файлом externs jQuery 1.6 и получаю следующий результат:
$.ajax({success:function(a){alert(a.a)}});
Он также выдает предупреждение о том, что свойство Success
не определено, поскольку Я ожидал, но он не может переименовать Success
в просто a
, что все равно нарушит мой код. Я просматриваю аннотацию ajax
и нахожу это выражение типа {Object.
, аннотирую свой код соответствующим образом и перекомпилирую. Все еще не работает ...