JavaScript父变量值不规则?
我有以下代码:JavaScript父变量值不规则?,javascript,variables,function,Javascript,Variables,Function,我有以下代码: var address; getAddress(0,0); function getAddress(latlng) { if (latlng != null) { geocoder.getLocations(latlng, function(addresses) { if(addresses.Status.code == 200) { address = addresses.Placemark[0
var address;
getAddress(0,0);
function getAddress(latlng)
{
if (latlng != null)
{
geocoder.getLocations(latlng,
function(addresses)
{
if(addresses.Status.code == 200)
{
address = addresses.Placemark[0].address.toString();
alert(address); // Outputs something :)
}
});
}
return address; //returns nothing :(
}
address始终返回undefined,但警报确实输出了一些内容。为什么会这样
Geocoder是的一个例子,我认为您的问题都与范围有关。一般来说,您不希望依赖于要在函数范围内使用的变量的全局声明 这将纠正与您的职能有关的任何范围问题:
var address = getAddress(0,0);
function getAddress(latlng) {
if (latlng != null) {
var address = geocoder.getLocations(latlng, function(addresses) {
if(addresses.Status.code == 200) {
return addresses.Placemark[0].address.toString();
}
});
}
return address;
}
我认为你的问题都与范围有关。一般来说,您不希望依赖于要在函数范围内使用的变量的全局声明 这将纠正与您的职能有关的任何范围问题:
var address = getAddress(0,0);
function getAddress(latlng) {
if (latlng != null) {
var address = geocoder.getLocations(latlng, function(addresses) {
if(addresses.Status.code == 200) {
return addresses.Placemark[0].address.toString();
}
});
}
return address;
}
我看不出这有什么不起作用的原因 为了确保没有返回任何内容,函数调用如下所示
window.alert(getAddress(0,0));
然后看看输出的是什么我看不出这不起作用的任何原因 为了确保没有返回任何内容,函数调用如下所示
window.alert(getAddress(0,0));
然后看看输出的是什么如果我没弄错的话
geocoder.getLocations
不会返回值,但需要回调函数,在您的情况下:
function(addresses) {
if(addresses.Status.code == 200) {
return addresses.Placemark[0].address.toString();
}
}
这种内部返回不会有多大作用,因为它将返回geocoder.getLocations的内部
因此,执行赋值的函数的调用可能晚于返回回调的外部函数,200状态表明涉及到一个缓慢的http调用
也就是说,除非您可以修改geocoder.getLocations,否则解决方案将是使您的函数也能正常工作,例如:
function getAddress(latlng, callback) {
if (latlng != null) {
geocoder.getLocations(latlng, function(addresses){
if(addresses.Status.code == 200) {
address = addresses.Placemark[0].address.toString();
alert(address);
//Outputs something :)
callback(address);
}
});
}
getAddress(ll, function(address){
alert(address);
});
}
你可以这样称呼它:
function getAddress(latlng, callback) {
if (latlng != null) {
geocoder.getLocations(latlng, function(addresses){
if(addresses.Status.code == 200) {
address = addresses.Placemark[0].address.toString();
alert(address);
//Outputs something :)
callback(address);
}
});
}
getAddress(ll, function(address){
alert(address);
});
作为奖励,您可以去掉全局变量:-如果我没有弄错的话,它看起来像
geocoder.getLocations
不会返回值,但需要回调函数,在您的情况下:
function(addresses) {
if(addresses.Status.code == 200) {
return addresses.Placemark[0].address.toString();
}
}
这种内部返回不会有多大作用,因为它将返回geocoder.getLocations的内部
因此,执行赋值的函数的调用可能晚于返回回调的外部函数,200状态表明涉及到一个缓慢的http调用
也就是说,除非您可以修改geocoder.getLocations,否则解决方案将是使您的函数也能正常工作,例如:
function getAddress(latlng, callback) {
if (latlng != null) {
geocoder.getLocations(latlng, function(addresses){
if(addresses.Status.code == 200) {
address = addresses.Placemark[0].address.toString();
alert(address);
//Outputs something :)
callback(address);
}
});
}
getAddress(ll, function(address){
alert(address);
});
}
你可以这样称呼它:
function getAddress(latlng, callback) {
if (latlng != null) {
geocoder.getLocations(latlng, function(addresses){
if(addresses.Status.code == 200) {
address = addresses.Placemark[0].address.toString();
alert(address);
//Outputs something :)
callback(address);
}
});
}
getAddress(ll, function(address){
alert(address);
});
作为奖励,您可以去掉全局变量:-通过将geocoder.getLocations实现为异步,我成功地再现了错误。如果geocoder.getLocations只是执行parameter函数,那么变量的更改将在getAddress返回之前可见,因此这不是范围问题
var address;
alert("B: address returned: " + getAddress());
function getAddress() {
executeFunction(function() {
address = "myAddress";
alert("C: address set to: " + address);
});
return address;
}
function executeFunction(aFunction) {
alert("A: executing: " + aFunction);
window.setTimeout(aFunction, 1);
}
执行上述代码将导致警报顺序A-B-C,这意味着地址在分配之前返回。更换window.setTimeoutaFunction,1;函数结果的顺序为A-C-B,最后一个警报为B:address返回:myAddress。我通过将geocoder.getLocations实现为异步,成功地再现了错误。如果geocoder.getLocations只是执行parameter函数,那么变量的更改将在getAddress返回之前可见,因此这不是范围问题
var address;
alert("B: address returned: " + getAddress());
function getAddress() {
executeFunction(function() {
address = "myAddress";
alert("C: address set to: " + address);
});
return address;
}
function executeFunction(aFunction) {
alert("A: executing: " + aFunction);
window.setTimeout(aFunction, 1);
}
执行上述代码将导致警报顺序A-B-C,这意味着地址在分配之前返回。更换window.setTimeoutaFunction,1;函数结果的顺序为A-C-B,最后一个警报是B:address returned:myAddress。这似乎是一种容易回答的方式,也可能是一种难以回答的方式:geocoder.getLocations是如何定义的?在不知道的情况下,很难说出需要做哪些更改。getAddress0,0不应该只有一个参数吗?getAddress[0,0]?这似乎是一种容易回答的方式,也可能是一种难以回答的方式:geocoder.getLocations是如何定义的?在不知道的情况下,很难说出需要做哪些更改。getAddress0,0不应该只有一个参数吗?getAddress[0,0]?有很多关于函数式javascript的阅读材料:有很多关于函数式javascript的阅读材料: