从其他功能访问变量

问题描述:

所以我做了一个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。

+0

你确定你有Codepen完全相同的代码?因为它不应该工作。 'url'变量是在'showPosition'范围内定义的,所以在另一个函数/范围中使用它应该是不可能的。 –

+0

我很确定,这里是codepen的链接:https://codepen.io/benasl/pen/WZRYzg?editors=0011 –

您的lat,lonurl变量不在您的其余函数的范围内。你可以通过声明你的函数之外的变量,像这样解决此问题:

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.希望有所帮助!

+0

谢谢,把这些变量放在所有函数之外的是我的初始代码,但是当我尝试把它们放在getPosition函数中,整个事情仍然有效,因此我的问题是:为什么它会起作用? –

+1

@BenasLengvinas如果你不使用var关键字在getPosition函数中声明这些变量,JavaScript将自动将它们分配给全局范围。而且由于它们将在全局范围内分配,所有功能都可以访问它们。许多JS陷阱之一:) –

+0

就是这样 - 我曾使用var关键字声明。以下是codepen:https://codepen.io/benasl/pen/WZRYzg?editors=0011 –

JavaScript范围是基于函数的。 showPosition函数是与getPosition函数分开的函数,它们是同级函数;即showPosition不嵌套在getPosition内部,因此它无法查看范围为showPosition的变量。如果您想要showPositionurl的可见性,那么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); 
+0

我的初始代码是在全局范围内的那些变量,然而我试图将这些变量添加到getPosition函数中,所有的东西都还在工作,所以我的问题是:为什么它会起作用? –