从其他功能访问变量
所以我做了一个freeCodeCamp的项目,在这个项目中我必须获取您的位置并显示该位置的天气。一切正常(但它试图通过反复试验),但我不明白为什么我可以在putInHtml
函数访问url
变量,因为所有变量都在getPosition
函数中声明。从其他功能访问变量
这里是所有代码:
function getPosition(){
var lat, lon, url;
if(navigator.geolocation){
navigator.geolocation.getCurrentPosition(showPosition);
} else {
alert('Cant find location');
}
}
function showPosition(pos) { /// paima objecta is getCurrentPosition
lat = pos.coords.latitude;
lon = pos.coords.longitude;
url = "https://fcc-weather-api.glitch.me/api/current?lat="+lat+"&lon="+lon;
}
getPosition();
function putInHtml(){
$.ajax({
type:"GET",
url: url,
dataType:"json",
success: function(data){
$('#location').html(data.name);
$('#temp').html(data.main.temp);
$('#desc').html(data.weather[0].description)
},
error: function (request, status, error) {
console.log(error);
}
})
}
$("#spust").click(putInHtml);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h1 class="text-center">Weather App</h1>
<h2 id="location"></h2>
<h1 id="temp"></h1>
<p id="desc"></p>
<button id="spust">Spust</button>
好,不知它并不在这里工作,但它确实codepen。
您的lat
,lon
和url
变量不在您的其余函数的范围内。你可以通过声明你的函数之外的变量,像这样解决此问题:
var lat, lon, url;
function getPosition(){
//Removed your variables from here
if(navigator.geolocation){
navigator.geolocation.getCurrentPosition(showPosition);
} else {
alert('Cant find location');
}
}
function showPosition(pos) { /// paima objecta is getCurrentPosition
lat = pos.coords.latitude;
lon = pos.coords.longitude;
url = "https://fcc-weather-api.glitch.me/api/current?lat="+lat+"&lon="+lon;
}
getPosition();
function putInHtml(){
$.ajax({
type:"GET",
url: url,
dataType:"json",
success: function(data){
$('#location').html(data.name);
$('#temp').html(data.main.temp);
$('#desc').html(data.weather[0].description)
},
error: function (request, status, error) {
console.log(error);
}
})
}
$("#spust").click(putInHtml);
现在你的变量会在您的所有功能的范围,因为我们已经将它们添加到全球范围内。详细了解范围here.希望有所帮助!
谢谢,把这些变量放在所有函数之外的是我的初始代码,但是当我尝试把它们放在getPosition函数中,整个事情仍然有效,因此我的问题是:为什么它会起作用? –
@BenasLengvinas如果你不使用var关键字在getPosition函数中声明这些变量,JavaScript将自动将它们分配给全局范围。而且由于它们将在全局范围内分配,所有功能都可以访问它们。许多JS陷阱之一:) –
就是这样 - 我曾使用var关键字声明。以下是codepen:https://codepen.io/benasl/pen/WZRYzg?editors=0011 –
JavaScript范围是基于函数的。 showPosition
函数是与getPosition
函数分开的函数,它们是同级函数;即showPosition
不嵌套在getPosition
内部,因此它无法查看范围为showPosition
的变量。如果您想要showPosition
对url
的可见性,那么url
必须在包含这两个函数的范围内声明为较高。例如全局范围,包含这两种功能的功能(如IIFE)或ES6 class。或者,您可以将url
的声明更改为ES6 let
statement,以引入包含这两个函数的块范围。
在此功能中,
function showPosition(pos) { /// paima objecta is getCurrentPosition
lat = pos.coords.latitude;
lon = pos.coords.longitude;
url = "https://fcc-weather-api.glitch.me/api/current?lat="+lat+"&lon="+lon;
}
网址是在全球范围内,因为你不使用VAR
var url = "https://fcc-weather-api.glitch.me/api/current?lat="+lat+"&lon="+lon;
与VAR宣布,将限制其范围showPosition功能那么你将无法在该功能之外使用。
定义任何函数之外的全局变量,因此您可以访问或更新其内部或外部的任何功能:
var url; //This makes the URL globally defined
function getPosition(){
var lat, lon, url;
if(navigator.geolocation){
navigator.geolocation.getCurrentPosition(showPosition);
} else {
alert('Cant find location');
}
}
function showPosition(pos) { /// paima objecta is getCurrentPosition
lat = pos.coords.latitude;
lon = pos.coords.longitude;
url = "https://fcc-weather-api.glitch.me/api/current?lat="+lat+"&lon="+lon;
}
getPosition();
function putInHtml(){
$.ajax({
type:"GET",
url: url,
dataType:"json",
success: function(data){
$('#location').html(data.name);
$('#temp').html(data.main.temp);
$('#desc').html(data.weather[0].description)
},
error: function (request, status, error) {
console.log(error);
}
})
}
$("#spust").click(putInHtml);
我的初始代码是在全局范围内的那些变量,然而我试图将这些变量添加到getPosition函数中,所有的东西都还在工作,所以我的问题是:为什么它会起作用? –
你确定你有Codepen完全相同的代码?因为它不应该工作。 'url'变量是在'showPosition'范围内定义的,所以在另一个函数/范围中使用它应该是不可能的。 –
我很确定,这里是codepen的链接:https://codepen.io/benasl/pen/WZRYzg?editors=0011 –