全局变量不是全局的——只在函数内
Global variables are not global - only within function
我观察访问者的位置并将当前坐标存储在两个变量中,latitude
和 longitude
。当访问者点击地图时,新标记的坐标将存储在另外两个变量中,click_latitude
和 click_longitude
.
完成此操作后,我想将跨度 .test
中标记的坐标显示为文本。问题是 coordinates_click
(包含 click_latitude
和 click_longitude
)总是空的!标记的坐标仅存储在 map.on('click', function(e1) { ... }
内的变量中,无法在函数外访问。
为什么以及如何解决这个问题?
if(navigator.geolocation) {
// VARIABLES
var gps_timeout = 10 * 1000 * 1000;
// MAP
map = L.map('map', {
maxZoom: 17,
minZoom: 7
}).setView([59.380767, 13.503022], 13);
// MAP (copyright)
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: 'Map data © OpenStreetMap contributors'
}).addTo(map);
// GPS
navigator.geolocation.watchPosition(success, error, {
enableHighAccuracy: true,
timeout: gps_timeout,
maximumAge: 0
});
// ADD MARKER
map.on('click', function(e1) {
// IF
if(typeof(marker) === 'undefined') {
marker = new L.marker(e1.latlng).addTo(map);
var position = marker.getLatLng();
var click_latitude = position.lat.toFixed(6);
var click_longitude = position.lng.toFixed(6);
map.panTo(new L.LatLng(click_latitude, click_longitude));
// IF
} else {
marker.setLatLng(e1.latlng);
var position = marker.getLatLng();
var click_latitude = position.lat.toFixed(6);
var click_longitude = position.lng.toFixed(6);
map.panTo(new L.LatLng(click_latitude, click_longitude));
}
});
// IF
} else {
// error handler
}
function success(position) {
// VARIABLES
latitude = position.coords.latitude.toFixed(6);
longitude = position.coords.longitude.toFixed(6);
coordinates_current = latitude + ',' + longitude;
coordinates_click = window.click_latitude + ',' + window.click_longitude;
// IF
if(coordinates_click !== '') {
$('.test').text(coordinates_click);
}
}
如果你想尝试,请到https://erik-edgren.nu/map。 上面的代码更新为当前代码。请看下面我的回答。
因此,您要声明 click_latitude
和 click_longitude
局部于您的事件函数(映射 click
处理程序和 success
功能)。 var
声明总是有一个函数作用域。
如果你想在几个函数之间共享一个变量,你可以使用 closure (see also this answer):
$(document).ready(function() {
var click_latitude, click_longitude;
...
map.on('click', function(e1) {
click_latitude = ...
click_longitude = ...
}
...
function success(position) {
var coordinates_click = click_latitude + ',' + click_longitude;
$('.test').text(coordinates_click);
}
}
$(document).ready(function() {
...
map.on('click', function(e1) {
window.click_latitude = ...
window.click_longitude = ...
}
...
function success(position) {
var coordinates_click = window.click_latitude + ',' + window.click_longitude;
$('.test').text(coordinates_click);
}
}
我观察访问者的位置并将当前坐标存储在两个变量中,latitude
和 longitude
。当访问者点击地图时,新标记的坐标将存储在另外两个变量中,click_latitude
和 click_longitude
.
完成此操作后,我想将跨度 .test
中标记的坐标显示为文本。问题是 coordinates_click
(包含 click_latitude
和 click_longitude
)总是空的!标记的坐标仅存储在 map.on('click', function(e1) { ... }
内的变量中,无法在函数外访问。
为什么以及如何解决这个问题?
if(navigator.geolocation) {
// VARIABLES
var gps_timeout = 10 * 1000 * 1000;
// MAP
map = L.map('map', {
maxZoom: 17,
minZoom: 7
}).setView([59.380767, 13.503022], 13);
// MAP (copyright)
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: 'Map data © OpenStreetMap contributors'
}).addTo(map);
// GPS
navigator.geolocation.watchPosition(success, error, {
enableHighAccuracy: true,
timeout: gps_timeout,
maximumAge: 0
});
// ADD MARKER
map.on('click', function(e1) {
// IF
if(typeof(marker) === 'undefined') {
marker = new L.marker(e1.latlng).addTo(map);
var position = marker.getLatLng();
var click_latitude = position.lat.toFixed(6);
var click_longitude = position.lng.toFixed(6);
map.panTo(new L.LatLng(click_latitude, click_longitude));
// IF
} else {
marker.setLatLng(e1.latlng);
var position = marker.getLatLng();
var click_latitude = position.lat.toFixed(6);
var click_longitude = position.lng.toFixed(6);
map.panTo(new L.LatLng(click_latitude, click_longitude));
}
});
// IF
} else {
// error handler
}
function success(position) {
// VARIABLES
latitude = position.coords.latitude.toFixed(6);
longitude = position.coords.longitude.toFixed(6);
coordinates_current = latitude + ',' + longitude;
coordinates_click = window.click_latitude + ',' + window.click_longitude;
// IF
if(coordinates_click !== '') {
$('.test').text(coordinates_click);
}
}
如果你想尝试,请到https://erik-edgren.nu/map。 上面的代码更新为当前代码。请看下面我的回答。
因此,您要声明 click_latitude
和 click_longitude
局部于您的事件函数(映射 click
处理程序和 success
功能)。 var
声明总是有一个函数作用域。
如果你想在几个函数之间共享一个变量,你可以使用 closure (see also this answer):
$(document).ready(function() {
var click_latitude, click_longitude;
...
map.on('click', function(e1) {
click_latitude = ...
click_longitude = ...
}
...
function success(position) {
var coordinates_click = click_latitude + ',' + click_longitude;
$('.test').text(coordinates_click);
}
}
$(document).ready(function() {
...
map.on('click', function(e1) {
window.click_latitude = ...
window.click_longitude = ...
}
...
function success(position) {
var coordinates_click = window.click_latitude + ',' + window.click_longitude;
$('.test').text(coordinates_click);
}
}