Доброго времени суток! Прошу уделить мне минуту времени и попробовать повторно разъяснить про видимость переменных, ибо эта базовая вещь до меня с первого раза никак не дошла, и я делаю неправильно.
Взять, к примеру, Heatmap Module.
ymaps.ready(init);
function init(){
myMap = {......};
ymaps.modules.require(['Heatmap'], function (Heatmap) {
heatmap = new Heatmap({}, {
gradient: gradients[0],
radius: radiuses[1],
opacity: opacities[2]
});
heatmap.setMap(myMap);
}); //heatmap
} //initРаботает, показывает. Нужна кнопка вкл/выкл.
Куда бы и в какой бы последовательности я ни запихнул это
var heatmap = new ymaps.control.Button({
data: {
content: 'ВКЛ/ВЫКЛ'
}
});
myMap.controls.add(heatmap);
heatmap.events.add('press', function () {
heatmap.setMap(
heatmap.getMap() ? null : myMap
);
});Я получу разную ошибку. Либо heatmap.setMap is not a function, либо heatmap is not defined. При размещении всего этого внутри function (Heatmap) { ошибок не выдаёт до клика по кнопке, затем heatmap.setMap is not a function.
Хотя я посмотрел на этот heatmap внутри:
heatmap.events.add('press', function () {
explain(heatmap); //смотрю в консоль
);
function explain(obj) {for (var i in obj) { console.log(i); } console.log(obj);}
Консоль:
state
data
options
events
_itemImplementation
eventProxy
_layout
_layoutDeferred
_selected
_enabled
_toolBarButtonComponent
id_14694794915907087
_layoutCancelableCallback
_visibilityMonitor
constructor
_setupLayoutEventRules
_onClick
select
deselect
isSelected
enable
disable
isEnabled
_onStateChange
_setupSelectableEventRules
getLayout
getLayoutSync
onAddToMap
onRemoveFromMap
_setupLayout
_destroyLayout
_createLayout
_onVisibilityChange
_setVisibleState
_fireLayoutChangeEvent
getParent
setParent
getMap
createOptionManager
_onParentChange
_onMapChangeи никакого setMap не вижу.
Я очень долго мучался, и до меня никак не дошло, как сделать эту кнопку. До этого я так же бесполезно мучался с PieChart, и мучения будут бесконечны, пока я чего-то не пойму. Можно ли эту ситуацию объяснить на уровне "чайника", так сказать, ибо я уверен, что какая-то простейшая банальщина.
Конечно, я могу вместо var heatmap= написать просто heatmap= внутри функции, и область видимости станет глобальной, кнопка заработает, но такое решение выпилят из JS в самом ближайшем будущем, и всё сломается. Я бы хотел понять, как правильно.