Нет, это не ошибка.
При первом вызове addTab()
переменная tabs
равна null
, поэтому выполняется тело оператора if.Внутри метода if, если вы определяете add
, тело работает с data.name
(Example 1
).Это ожидается.
Проблема заключается в том, что во время 1-го запуска создается замыкание, которое содержит переменную data
со значением Example 1
.Когда вы вызываете ваш addTab()
2-й раз, tabs
уже создан, и внутри add
метод data.name
все еще ссылается на old data.name
, который был сохранен во время 1-го запуска.Ваш alert()
не может видеть новое значение data
.
См. http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/.
Вы можете решить это, не , получая доступ addTabs
переменные / параметры внутри add
напрямую, потому что это "сохранит их" в замыкании, но с использованием другого механизма, такого как jQuery .data () .
var tabs = null;
function addTab(id, title, data) {
if (tabs === null) {
tabs = $("#center-tabs").tabs({
tabTemplate: "...",
add: function (event, ui) {
console.log("Event: " + $(this).data('name'));
}
});
}
tabs.data('name', data.name);
tabs.tabs("add", id, title);
tabs.tabs("select", id);
}
ЗДЕСЬ является примером.